aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/atm/nicstar.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/atm/nicstar.c')
-rw-r--r--drivers/atm/nicstar.c117
1 files changed, 19 insertions, 98 deletions
diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
index 0c205b000e8b..38c769f8d2b7 100644
--- a/drivers/atm/nicstar.c
+++ b/drivers/atm/nicstar.c
@@ -125,85 +125,6 @@
125#define ATM_SKB(s) (&(s)->atm) 125#define ATM_SKB(s) (&(s)->atm)
126#endif 126#endif
127 127
128 /* Spinlock debugging stuff */
129#ifdef NS_DEBUG_SPINLOCKS /* See nicstar.h */
130#define ns_grab_int_lock(card,flags) \
131 do { \
132 unsigned long nsdsf, nsdsf2; \
133 local_irq_save(flags); \
134 save_flags(nsdsf); cli();\
135 if (nsdsf & (1<<9)) printk ("nicstar.c: ints %sabled -> enabled.\n", \
136 (flags)&(1<<9)?"en":"dis"); \
137 if (spin_is_locked(&(card)->int_lock) && \
138 (card)->cpu_int == smp_processor_id()) { \
139 printk("nicstar.c: line %d (cpu %d) int_lock already locked at line %d (cpu %d)\n", \
140 __LINE__, smp_processor_id(), (card)->has_int_lock, \
141 (card)->cpu_int); \
142 printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \
143 } \
144 if (spin_is_locked(&(card)->res_lock) && \
145 (card)->cpu_res == smp_processor_id()) { \
146 printk("nicstar.c: line %d (cpu %d) res_lock locked at line %d (cpu %d)(trying int)\n", \
147 __LINE__, smp_processor_id(), (card)->has_res_lock, \
148 (card)->cpu_res); \
149 printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \
150 } \
151 spin_lock_irq(&(card)->int_lock); \
152 (card)->has_int_lock = __LINE__; \
153 (card)->cpu_int = smp_processor_id(); \
154 restore_flags(nsdsf); } while (0)
155#define ns_grab_res_lock(card,flags) \
156 do { \
157 unsigned long nsdsf, nsdsf2; \
158 local_irq_save(flags); \
159 save_flags(nsdsf); cli();\
160 if (nsdsf & (1<<9)) printk ("nicstar.c: ints %sabled -> enabled.\n", \
161 (flags)&(1<<9)?"en":"dis"); \
162 if (spin_is_locked(&(card)->res_lock) && \
163 (card)->cpu_res == smp_processor_id()) { \
164 printk("nicstar.c: line %d (cpu %d) res_lock already locked at line %d (cpu %d)\n", \
165 __LINE__, smp_processor_id(), (card)->has_res_lock, \
166 (card)->cpu_res); \
167 printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \
168 } \
169 spin_lock_irq(&(card)->res_lock); \
170 (card)->has_res_lock = __LINE__; \
171 (card)->cpu_res = smp_processor_id(); \
172 restore_flags(nsdsf); } while (0)
173#define ns_grab_scq_lock(card,scq,flags) \
174 do { \
175 unsigned long nsdsf, nsdsf2; \
176 local_irq_save(flags); \
177 save_flags(nsdsf); cli();\
178 if (nsdsf & (1<<9)) printk ("nicstar.c: ints %sabled -> enabled.\n", \
179 (flags)&(1<<9)?"en":"dis"); \
180 if (spin_is_locked(&(scq)->lock) && \
181 (scq)->cpu_lock == smp_processor_id()) { \
182 printk("nicstar.c: line %d (cpu %d) this scq_lock already locked at line %d (cpu %d)\n", \
183 __LINE__, smp_processor_id(), (scq)->has_lock, \
184 (scq)->cpu_lock); \
185 printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \
186 } \
187 if (spin_is_locked(&(card)->res_lock) && \
188 (card)->cpu_res == smp_processor_id()) { \
189 printk("nicstar.c: line %d (cpu %d) res_lock locked at line %d (cpu %d)(trying scq)\n", \
190 __LINE__, smp_processor_id(), (card)->has_res_lock, \
191 (card)->cpu_res); \
192 printk("nicstar.c: ints were %sabled.\n", ((flags)&(1<<9)?"en":"dis")); \
193 } \
194 spin_lock_irq(&(scq)->lock); \
195 (scq)->has_lock = __LINE__; \
196 (scq)->cpu_lock = smp_processor_id(); \
197 restore_flags(nsdsf); } while (0)
198#else /* !NS_DEBUG_SPINLOCKS */
199#define ns_grab_int_lock(card,flags) \
200 spin_lock_irqsave(&(card)->int_lock,(flags))
201#define ns_grab_res_lock(card,flags) \
202 spin_lock_irqsave(&(card)->res_lock,(flags))
203#define ns_grab_scq_lock(card,scq,flags) \
204 spin_lock_irqsave(&(scq)->lock,flags)
205#endif /* NS_DEBUG_SPINLOCKS */
206
207 128
208/* Function declarations ******************************************************/ 129/* Function declarations ******************************************************/
209 130
@@ -422,7 +343,7 @@ static u32 ns_read_sram(ns_dev *card, u32 sram_address)
422 sram_address <<= 2; 343 sram_address <<= 2;
423 sram_address &= 0x0007FFFC; /* address must be dword aligned */ 344 sram_address &= 0x0007FFFC; /* address must be dword aligned */
424 sram_address |= 0x50000000; /* SRAM read command */ 345 sram_address |= 0x50000000; /* SRAM read command */
425 ns_grab_res_lock(card, flags); 346 spin_lock_irqsave(&card->res_lock, flags);
426 while (CMD_BUSY(card)); 347 while (CMD_BUSY(card));
427 writel(sram_address, card->membase + CMD); 348 writel(sram_address, card->membase + CMD);
428 while (CMD_BUSY(card)); 349 while (CMD_BUSY(card));
@@ -440,7 +361,7 @@ static void ns_write_sram(ns_dev *card, u32 sram_address, u32 *value, int count)
440 count--; /* count range now is 0..3 instead of 1..4 */ 361 count--; /* count range now is 0..3 instead of 1..4 */
441 c = count; 362 c = count;
442 c <<= 2; /* to use increments of 4 */ 363 c <<= 2; /* to use increments of 4 */
443 ns_grab_res_lock(card, flags); 364 spin_lock_irqsave(&card->res_lock, flags);
444 while (CMD_BUSY(card)); 365 while (CMD_BUSY(card));
445 for (i = 0; i <= c; i += 4) 366 for (i = 0; i <= c; i += 4)
446 writel(*(value++), card->membase + i); 367 writel(*(value++), card->membase + i);
@@ -1166,7 +1087,7 @@ static void push_rxbufs(ns_dev *card, struct sk_buff *skb)
1166 card->lbfqc += 2; 1087 card->lbfqc += 2;
1167 } 1088 }
1168 1089
1169 ns_grab_res_lock(card, flags); 1090 spin_lock_irqsave(&card->res_lock, flags);
1170 1091
1171 while (CMD_BUSY(card)); 1092 while (CMD_BUSY(card));
1172 writel(addr2, card->membase + DR3); 1093 writel(addr2, card->membase + DR3);
@@ -1206,7 +1127,7 @@ static irqreturn_t ns_irq_handler(int irq, void *dev_id)
1206 1127
1207 PRINTK("nicstar%d: NICStAR generated an interrupt\n", card->index); 1128 PRINTK("nicstar%d: NICStAR generated an interrupt\n", card->index);
1208 1129
1209 ns_grab_int_lock(card, flags); 1130 spin_lock_irqsave(&card->int_lock, flags);
1210 1131
1211 stat_r = readl(card->membase + STAT); 1132 stat_r = readl(card->membase + STAT);
1212 1133
@@ -1585,7 +1506,7 @@ static void ns_close(struct atm_vcc *vcc)
1585 unsigned long flags; 1506 unsigned long flags;
1586 1507
1587 addr = NS_RCT + (vcc->vpi << card->vcibits | vcc->vci) * NS_RCT_ENTRY_SIZE; 1508 addr = NS_RCT + (vcc->vpi << card->vcibits | vcc->vci) * NS_RCT_ENTRY_SIZE;
1588 ns_grab_res_lock(card, flags); 1509 spin_lock_irqsave(&card->res_lock, flags);
1589 while(CMD_BUSY(card)); 1510 while(CMD_BUSY(card));
1590 writel(NS_CMD_CLOSE_CONNECTION | addr << 2, card->membase + CMD); 1511 writel(NS_CMD_CLOSE_CONNECTION | addr << 2, card->membase + CMD);
1591 spin_unlock_irqrestore(&card->res_lock, flags); 1512 spin_unlock_irqrestore(&card->res_lock, flags);
@@ -1607,7 +1528,7 @@ static void ns_close(struct atm_vcc *vcc)
1607 NS_SKB(iovb)->iovcnt); 1528 NS_SKB(iovb)->iovcnt);
1608 NS_SKB(iovb)->iovcnt = 0; 1529 NS_SKB(iovb)->iovcnt = 0;
1609 NS_SKB(iovb)->vcc = NULL; 1530 NS_SKB(iovb)->vcc = NULL;
1610 ns_grab_int_lock(card, flags); 1531 spin_lock_irqsave(&card->int_lock, flags);
1611 recycle_iov_buf(card, iovb); 1532 recycle_iov_buf(card, iovb);
1612 spin_unlock_irqrestore(&card->int_lock, flags); 1533 spin_unlock_irqrestore(&card->int_lock, flags);
1613 vc->rx_iov = NULL; 1534 vc->rx_iov = NULL;
@@ -1629,7 +1550,7 @@ static void ns_close(struct atm_vcc *vcc)
1629 1550
1630 for (;;) 1551 for (;;)
1631 { 1552 {
1632 ns_grab_scq_lock(card, scq, flags); 1553 spin_lock_irqsave(&scq->lock, flags);
1633 scqep = scq->next; 1554 scqep = scq->next;
1634 if (scqep == scq->base) 1555 if (scqep == scq->base)
1635 scqep = scq->last; 1556 scqep = scq->last;
@@ -1691,7 +1612,7 @@ static void ns_close(struct atm_vcc *vcc)
1691 unsigned long flags; 1612 unsigned long flags;
1692 scq_info *scq = card->scq0; 1613 scq_info *scq = card->scq0;
1693 1614
1694 ns_grab_scq_lock(card, scq, flags); 1615 spin_lock_irqsave(&scq->lock, flags);
1695 1616
1696 for(i = 0; i < scq->num_entries; i++) { 1617 for(i = 0; i < scq->num_entries; i++) {
1697 if(scq->skb[i] && ATM_SKB(scq->skb[i])->vcc == vcc) { 1618 if(scq->skb[i] && ATM_SKB(scq->skb[i])->vcc == vcc) {
@@ -1892,7 +1813,7 @@ static int push_scqe(ns_dev *card, vc_map *vc, scq_info *scq, ns_scqe *tbd,
1892 u32 data; 1813 u32 data;
1893 int index; 1814 int index;
1894 1815
1895 ns_grab_scq_lock(card, scq, flags); 1816 spin_lock_irqsave(&scq->lock, flags);
1896 while (scq->tail == scq->next) 1817 while (scq->tail == scq->next)
1897 { 1818 {
1898 if (in_interrupt()) { 1819 if (in_interrupt()) {
@@ -1904,7 +1825,7 @@ static int push_scqe(ns_dev *card, vc_map *vc, scq_info *scq, ns_scqe *tbd,
1904 scq->full = 1; 1825 scq->full = 1;
1905 spin_unlock_irqrestore(&scq->lock, flags); 1826 spin_unlock_irqrestore(&scq->lock, flags);
1906 interruptible_sleep_on_timeout(&scq->scqfull_waitq, SCQFULL_TIMEOUT); 1827 interruptible_sleep_on_timeout(&scq->scqfull_waitq, SCQFULL_TIMEOUT);
1907 ns_grab_scq_lock(card, scq, flags); 1828 spin_lock_irqsave(&scq->lock, flags);
1908 1829
1909 if (scq->full) { 1830 if (scq->full) {
1910 spin_unlock_irqrestore(&scq->lock, flags); 1831 spin_unlock_irqrestore(&scq->lock, flags);
@@ -1953,7 +1874,7 @@ static int push_scqe(ns_dev *card, vc_map *vc, scq_info *scq, ns_scqe *tbd,
1953 if (has_run++) break; 1874 if (has_run++) break;
1954 spin_unlock_irqrestore(&scq->lock, flags); 1875 spin_unlock_irqrestore(&scq->lock, flags);
1955 interruptible_sleep_on_timeout(&scq->scqfull_waitq, SCQFULL_TIMEOUT); 1876 interruptible_sleep_on_timeout(&scq->scqfull_waitq, SCQFULL_TIMEOUT);
1956 ns_grab_scq_lock(card, scq, flags); 1877 spin_lock_irqsave(&scq->lock, flags);
1957 } 1878 }
1958 1879
1959 if (!scq->full) 1880 if (!scq->full)
@@ -2090,7 +2011,7 @@ static void drain_scq(ns_dev *card, scq_info *scq, int pos)
2090 return; 2011 return;
2091 } 2012 }
2092 2013
2093 ns_grab_scq_lock(card, scq, flags); 2014 spin_lock_irqsave(&scq->lock, flags);
2094 i = (int) (scq->tail - scq->base); 2015 i = (int) (scq->tail - scq->base);
2095 if (++i == scq->num_entries) 2016 if (++i == scq->num_entries)
2096 i = 0; 2017 i = 0;
@@ -2898,7 +2819,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg)
2898 { 2819 {
2899 struct sk_buff *hb; 2820 struct sk_buff *hb;
2900 2821
2901 ns_grab_int_lock(card, flags); 2822 spin_lock_irqsave(&card->int_lock, flags);
2902 hb = skb_dequeue(&card->hbpool.queue); 2823 hb = skb_dequeue(&card->hbpool.queue);
2903 card->hbpool.count--; 2824 card->hbpool.count--;
2904 spin_unlock_irqrestore(&card->int_lock, flags); 2825 spin_unlock_irqrestore(&card->int_lock, flags);
@@ -2917,7 +2838,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg)
2917 if (hb == NULL) 2838 if (hb == NULL)
2918 return -ENOMEM; 2839 return -ENOMEM;
2919 NS_SKB_CB(hb)->buf_type = BUF_NONE; 2840 NS_SKB_CB(hb)->buf_type = BUF_NONE;
2920 ns_grab_int_lock(card, flags); 2841 spin_lock_irqsave(&card->int_lock, flags);
2921 skb_queue_tail(&card->hbpool.queue, hb); 2842 skb_queue_tail(&card->hbpool.queue, hb);
2922 card->hbpool.count++; 2843 card->hbpool.count++;
2923 spin_unlock_irqrestore(&card->int_lock, flags); 2844 spin_unlock_irqrestore(&card->int_lock, flags);
@@ -2929,7 +2850,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg)
2929 { 2850 {
2930 struct sk_buff *iovb; 2851 struct sk_buff *iovb;
2931 2852
2932 ns_grab_int_lock(card, flags); 2853 spin_lock_irqsave(&card->int_lock, flags);
2933 iovb = skb_dequeue(&card->iovpool.queue); 2854 iovb = skb_dequeue(&card->iovpool.queue);
2934 card->iovpool.count--; 2855 card->iovpool.count--;
2935 spin_unlock_irqrestore(&card->int_lock, flags); 2856 spin_unlock_irqrestore(&card->int_lock, flags);
@@ -2948,7 +2869,7 @@ static int ns_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg)
2948 if (iovb == NULL) 2869 if (iovb == NULL)
2949 return -ENOMEM; 2870 return -ENOMEM;
2950 NS_SKB_CB(iovb)->buf_type = BUF_NONE; 2871 NS_SKB_CB(iovb)->buf_type = BUF_NONE;
2951 ns_grab_int_lock(card, flags); 2872 spin_lock_irqsave(&card->int_lock, flags);
2952 skb_queue_tail(&card->iovpool.queue, iovb); 2873 skb_queue_tail(&card->iovpool.queue, iovb);
2953 card->iovpool.count++; 2874 card->iovpool.count++;
2954 spin_unlock_irqrestore(&card->int_lock, flags); 2875 spin_unlock_irqrestore(&card->int_lock, flags);
@@ -2995,7 +2916,7 @@ static void ns_poll(unsigned long arg)
2995 /* Probably it isn't worth spinning */ 2916 /* Probably it isn't worth spinning */
2996 continue; 2917 continue;
2997 } 2918 }
2998 ns_grab_int_lock(card, flags); 2919 spin_lock_irqsave(&card->int_lock, flags);
2999 2920
3000 stat_w = 0; 2921 stat_w = 0;
3001 stat_r = readl(card->membase + STAT); 2922 stat_r = readl(card->membase + STAT);
@@ -3062,7 +2983,7 @@ static void ns_phy_put(struct atm_dev *dev, unsigned char value,
3062 unsigned long flags; 2983 unsigned long flags;
3063 2984
3064 card = dev->dev_data; 2985 card = dev->dev_data;
3065 ns_grab_res_lock(card, flags); 2986 spin_lock_irqsave(&card->res_lock, flags);
3066 while(CMD_BUSY(card)); 2987 while(CMD_BUSY(card));
3067 writel((unsigned long) value, card->membase + DR0); 2988 writel((unsigned long) value, card->membase + DR0);
3068 writel(NS_CMD_WRITE_UTILITY | 0x00000200 | (addr & 0x000000FF), 2989 writel(NS_CMD_WRITE_UTILITY | 0x00000200 | (addr & 0x000000FF),
@@ -3079,7 +3000,7 @@ static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr)
3079 unsigned long data; 3000 unsigned long data;
3080 3001
3081 card = dev->dev_data; 3002 card = dev->dev_data;
3082 ns_grab_res_lock(card, flags); 3003 spin_lock_irqsave(&card->res_lock, flags);
3083 while(CMD_BUSY(card)); 3004 while(CMD_BUSY(card));
3084 writel(NS_CMD_READ_UTILITY | 0x00000200 | (addr & 0x000000FF), 3005 writel(NS_CMD_READ_UTILITY | 0x00000200 | (addr & 0x000000FF),
3085 card->membase + CMD); 3006 card->membase + CMD);