Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 76832
Collapse All | Expand All

(-)fritz/src/driver.c.orig (-13 / +39 lines)
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

Return to bug 76832