Lines 18-23
Link Here
|
18 |
* http://www.opensource.org/licenses/lgpl-license.html |
18 |
* http://www.opensource.org/licenses/lgpl-license.html |
19 |
* |
19 |
* |
20 |
* Contact: AVM GmbH, Alt-Moabit 95, 10559 Berlin, Germany, email: info@avm.de |
20 |
* Contact: AVM GmbH, Alt-Moabit 95, 10559 Berlin, Germany, email: info@avm.de |
|
|
21 |
* |
22 |
* Mon Oct 20 22:43:31 2003 |
23 |
* Modified by Joerg Lehrke to improve locking |
24 |
* Fixed for rev 0.4.1 by Stefan Schweizer |
21 |
*/ |
25 |
*/ |
22 |
|
26 |
|
23 |
#include <asm/io.h> |
27 |
#include <asm/io.h> |
Lines 57-62
Link Here
|
57 |
#include "dbgif.h" |
61 |
#include "dbgif.h" |
58 |
#endif |
62 |
#endif |
59 |
|
63 |
|
|
|
64 |
#undef SINGLE_LOCK |
65 |
|
60 |
#define KILOBYTE 1024 |
66 |
#define KILOBYTE 1024 |
61 |
#define MEGABYTE (1024*KILOBYTE) |
67 |
#define MEGABYTE (1024*KILOBYTE) |
62 |
#define DMA_BUFFER_SIZE (9*KILOBYTE) |
68 |
#define DMA_BUFFER_SIZE (9*KILOBYTE) |
Lines 101-107
Link Here
|
101 |
static struct capi_ctr capi_ctrl[2]; |
107 |
static struct capi_ctr capi_ctrl[2]; |
102 |
static int capi_ctrl_ix = 0; |
108 |
static int capi_ctrl_ix = 0; |
103 |
static per_ctrl_t ctrl_params[2]; |
109 |
static per_ctrl_t ctrl_params[2]; |
|
|
110 |
#if defined (SINGLE_LOCK) |
111 |
# define stack_lock qt_lock |
112 |
#else |
104 |
static spinlock_t stack_lock = SPIN_LOCK_UNLOCKED; |
113 |
static spinlock_t stack_lock = SPIN_LOCK_UNLOCKED; |
|
|
114 |
#endif |
105 |
static atomic_t rx_flag = ATOMIC_INIT (0); |
115 |
static atomic_t rx_flag = ATOMIC_INIT (0); |
106 |
static atomic_t tx_flag = ATOMIC_INIT (0); |
116 |
static atomic_t tx_flag = ATOMIC_INIT (0); |
107 |
static atomic_t thread_flag = ATOMIC_INIT (0); |
117 |
static atomic_t thread_flag = ATOMIC_INIT (0); |
Lines 1142-1148
Link Here
|
1142 |
} /* remove_ctrl */ |
1152 |
} /* remove_ctrl */ |
1143 |
|
1153 |
|
1144 |
/*---------------------------------------------------------------------------*\ |
1154 |
/*---------------------------------------------------------------------------*\ |
1145 |
\*-C-------------------------------------------------------------------------*/ |
1155 |
\*---------------------------------------------------------------------------*/ |
1146 |
static inline int in_critical (void) { |
1156 |
static inline int in_critical (void) { |
1147 |
|
1157 |
|
1148 |
return (0 < atomic_read (&crit_count)); |
1158 |
return (0 < atomic_read (&crit_count)); |
Lines 1301-1307
Link Here
|
1301 |
capi_ctr_handle_message (ctrl, appl, skb); |
1311 |
capi_ctr_handle_message (ctrl, appl, skb); |
1302 |
} /* msg2capi */ |
1312 |
} /* msg2capi */ |
1303 |
|
1313 |
|
1304 |
/*-S-------------------------------------------------------------------------*\ |
1314 |
/*---------------------------------------------------------------------------*\ |
1305 |
\*---------------------------------------------------------------------------*/ |
1315 |
\*---------------------------------------------------------------------------*/ |
1306 |
static __attr void __stack scheduler_control (unsigned ena) { |
1316 |
static __attr void __stack scheduler_control (unsigned ena) { |
1307 |
int enabled = (int) ena; |
1317 |
int enabled = (int) ena; |
Lines 1323-1328
Link Here
|
1323 |
/*---------------------------------------------------------------------------*\ |
1333 |
/*---------------------------------------------------------------------------*\ |
1324 |
\*---------------------------------------------------------------------------*/ |
1334 |
\*---------------------------------------------------------------------------*/ |
1325 |
static int sched_thread (void * arg) { |
1335 |
static int sched_thread (void * arg) { |
|
|
1336 |
unsigned long flags; |
1326 |
|
1337 |
|
1327 |
UNUSED_ARG (arg); |
1338 |
UNUSED_ARG (arg); |
1328 |
daemonize (TARGET); |
1339 |
daemonize (TARGET); |
Lines 1356-1361
Link Here
|
1356 |
} |
1367 |
} |
1357 |
|
1368 |
|
1358 |
/* Body of thread, invoke scheduler */ |
1369 |
/* Body of thread, invoke scheduler */ |
|
|
1370 |
local_irq_save(flags); |
1359 |
if (spin_trylock (&stack_lock)) { |
1371 |
if (spin_trylock (&stack_lock)) { |
1360 |
os_timer_poll (); |
1372 |
os_timer_poll (); |
1361 |
assert (capi_lib->cm_schedule); |
1373 |
assert (capi_lib->cm_schedule); |
Lines 1364-1369
Link Here
|
1364 |
} |
1376 |
} |
1365 |
spin_unlock (&stack_lock); |
1377 |
spin_unlock (&stack_lock); |
1366 |
} |
1378 |
} |
|
|
1379 |
local_irq_restore(flags); |
1367 |
} |
1380 |
} |
1368 |
LOG("Scheduler thread stopped.\n"); |
1381 |
LOG("Scheduler thread stopped.\n"); |
1369 |
up (&hotplug); |
1382 |
up (&hotplug); |
Lines 1470-1486
Link Here
|
1470 |
/*---------------------------------------------------------------------------*\ |
1483 |
/*---------------------------------------------------------------------------*\ |
1471 |
\*---------------------------------------------------------------------------*/ |
1484 |
\*---------------------------------------------------------------------------*/ |
1472 |
static void tx_task (unsigned long data) { |
1485 |
static void tx_task (unsigned long data) { |
1473 |
|
1486 |
unsigned long flags; |
|
|
1487 |
|
1474 |
UNUSED_ARG (data); |
1488 |
UNUSED_ARG (data); |
1475 |
if (in_critical ()) { |
1489 |
if (in_critical ()) { |
1476 |
atomic_set (&tx_flag, 1); |
1490 |
atomic_set (&tx_flag, 1); |
1477 |
kick_scheduler (); |
1491 |
kick_scheduler (); |
1478 |
} else if (spin_trylock (&stack_lock)) { |
|
|
1479 |
tx_handler (capi_card); |
1480 |
spin_unlock (&stack_lock); |
1481 |
} else { |
1492 |
} else { |
1482 |
atomic_set (&tx_flag, 1); |
1493 |
local_irq_save(flags); |
1483 |
kick_scheduler (); |
1494 |
if (spin_trylock (&stack_lock)) { |
|
|
1495 |
tx_handler (capi_card); |
1496 |
spin_unlock (&stack_lock); |
1497 |
} else { |
1498 |
atomic_set (&tx_flag, 1); |
1499 |
kick_scheduler (); |
1500 |
} |
1501 |
local_irq_restore(flags); |
1484 |
} |
1502 |
} |
1485 |
} /* tx_task */ |
1503 |
} /* tx_task */ |
1486 |
|
1504 |
|
Lines 1533-1549
Link Here
|
1533 |
/*---------------------------------------------------------------------------*\ |
1551 |
/*---------------------------------------------------------------------------*\ |
1534 |
\*---------------------------------------------------------------------------*/ |
1552 |
\*---------------------------------------------------------------------------*/ |
1535 |
static void rx_task (unsigned long data) { |
1553 |
static void rx_task (unsigned long data) { |
|
|
1554 |
unsigned long flags; |
1536 |
|
1555 |
|
1537 |
UNUSED_ARG (data); |
1556 |
UNUSED_ARG (data); |
1538 |
if (in_critical ()) { |
1557 |
if (in_critical ()) { |
1539 |
atomic_set (&rx_flag, 1); |
1558 |
atomic_set (&rx_flag, 1); |
1540 |
kick_scheduler (); |
1559 |
kick_scheduler (); |
1541 |
} else if (spin_trylock (&stack_lock)) { |
|
|
1542 |
rx_handler (capi_card); |
1543 |
spin_unlock (&stack_lock); |
1544 |
} else { |
1560 |
} else { |
1545 |
atomic_set (&rx_flag, 1); |
1561 |
local_irq_save(flags); |
1546 |
kick_scheduler (); |
1562 |
if (spin_trylock (&stack_lock)) { |
|
|
1563 |
rx_handler (capi_card); |
1564 |
spin_unlock (&stack_lock); |
1565 |
} else { |
1566 |
atomic_set (&rx_flag, 1); |
1567 |
kick_scheduler (); |
1568 |
} |
1569 |
local_irq_restore(flags); |
1547 |
} |
1570 |
} |
1548 |
} /* rx_task */ |
1571 |
} /* rx_task */ |
1549 |
|
1572 |
|
Lines 1562-1567
Link Here
|
1562 |
return IRQ_NONE; |
1585 |
return IRQ_NONE; |
1563 |
} |
1586 |
} |
1564 |
cp = (card_p) args; |
1587 |
cp = (card_p) args; |
|
|
1588 |
spin_lock (&stack_lock); |
1565 |
while (0 != ((flags = PEEK (cp->io_base + INT_CTL)) & CARD_PCI_INT_ASSERT)) { |
1589 |
while (0 != ((flags = PEEK (cp->io_base + INT_CTL)) & CARD_PCI_INT_ASSERT)) { |
1566 |
++count; |
1590 |
++count; |
1567 |
assert (count < 3); |
1591 |
assert (count < 3); |
Lines 1572-1577
Link Here
|
1572 |
assert ((PEEK (cp->io_base + INT_CTL) |
1596 |
assert ((PEEK (cp->io_base + INT_CTL) |
1573 |
& ~(CARD_PCI_INT_ASSERT | CARD_PCI_INT_ISASSERTED)) != 0); |
1597 |
& ~(CARD_PCI_INT_ASSERT | CARD_PCI_INT_ISASSERTED)) != 0); |
1574 |
if (!atomic_read (&link_open)) { |
1598 |
if (!atomic_read (&link_open)) { |
|
|
1599 |
spin_unlock (&stack_lock); |
1575 |
return IRQ_HANDLED; |
1600 |
return IRQ_HANDLED; |
1576 |
} |
1601 |
} |
1577 |
tx_flag = PEEK (cp->io_base + XFER_TOTM_STATUS) == TM_READY; |
1602 |
tx_flag = PEEK (cp->io_base + XFER_TOTM_STATUS) == TM_READY; |
Lines 1586-1591
Link Here
|
1586 |
} |
1611 |
} |
1587 |
} |
1612 |
} |
1588 |
info (0 == (PEEK (cp->io_base + INT_CTL) & CARD_PCI_INT_ASSERT)); |
1613 |
info (0 == (PEEK (cp->io_base + INT_CTL) & CARD_PCI_INT_ASSERT)); |
|
|
1614 |
spin_unlock (&stack_lock); |
1589 |
return IRQ_RETVAL(count > 0); |
1615 |
return IRQ_RETVAL(count > 0); |
1590 |
} /* irq_handler */ |
1616 |
} /* irq_handler */ |
1591 |
|
1617 |
|