diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/lib8390.c | 26 |
1 files changed, 12 insertions, 14 deletions
diff --git a/drivers/net/lib8390.c b/drivers/net/lib8390.c index 72ffbeb829cc..ed495275b577 100644 --- a/drivers/net/lib8390.c +++ b/drivers/net/lib8390.c | |||
@@ -150,19 +150,19 @@ static void __NS8390_init(struct net_device *dev, int startp); | |||
150 | * card means that approach caused horrible problems like losing serial data | 150 | * card means that approach caused horrible problems like losing serial data |
151 | * at 38400 baud on some chips. Remember many 8390 nics on PCI were ISA | 151 | * at 38400 baud on some chips. Remember many 8390 nics on PCI were ISA |
152 | * chips with FPGA front ends. | 152 | * chips with FPGA front ends. |
153 | * | 153 | * |
154 | * Ok the logic behind the 8390 is very simple: | 154 | * Ok the logic behind the 8390 is very simple: |
155 | * | 155 | * |
156 | * Things to know | 156 | * Things to know |
157 | * - IRQ delivery is asynchronous to the PCI bus | 157 | * - IRQ delivery is asynchronous to the PCI bus |
158 | * - Blocking the local CPU IRQ via spin locks was too slow | 158 | * - Blocking the local CPU IRQ via spin locks was too slow |
159 | * - The chip has register windows needing locking work | 159 | * - The chip has register windows needing locking work |
160 | * | 160 | * |
161 | * So the path was once (I say once as people appear to have changed it | 161 | * So the path was once (I say once as people appear to have changed it |
162 | * in the mean time and it now looks rather bogus if the changes to use | 162 | * in the mean time and it now looks rather bogus if the changes to use |
163 | * disable_irq_nosync_irqsave are disabling the local IRQ) | 163 | * disable_irq_nosync_irqsave are disabling the local IRQ) |
164 | * | 164 | * |
165 | * | 165 | * |
166 | * Take the page lock | 166 | * Take the page lock |
167 | * Mask the IRQ on chip | 167 | * Mask the IRQ on chip |
168 | * Disable the IRQ (but not mask locally- someone seems to have | 168 | * Disable the IRQ (but not mask locally- someone seems to have |
@@ -170,22 +170,22 @@ static void __NS8390_init(struct net_device *dev, int startp); | |||
170 | * [This must be _nosync as the page lock may otherwise | 170 | * [This must be _nosync as the page lock may otherwise |
171 | * deadlock us] | 171 | * deadlock us] |
172 | * Drop the page lock and turn IRQs back on | 172 | * Drop the page lock and turn IRQs back on |
173 | * | 173 | * |
174 | * At this point an existing IRQ may still be running but we can't | 174 | * At this point an existing IRQ may still be running but we can't |
175 | * get a new one | 175 | * get a new one |
176 | * | 176 | * |
177 | * Take the lock (so we know the IRQ has terminated) but don't mask | 177 | * Take the lock (so we know the IRQ has terminated) but don't mask |
178 | * the IRQs on the processor | 178 | * the IRQs on the processor |
179 | * Set irqlock [for debug] | 179 | * Set irqlock [for debug] |
180 | * | 180 | * |
181 | * Transmit (slow as ****) | 181 | * Transmit (slow as ****) |
182 | * | 182 | * |
183 | * re-enable the IRQ | 183 | * re-enable the IRQ |
184 | * | 184 | * |
185 | * | 185 | * |
186 | * We have to use disable_irq because otherwise you will get delayed | 186 | * We have to use disable_irq because otherwise you will get delayed |
187 | * interrupts on the APIC bus deadlocking the transmit path. | 187 | * interrupts on the APIC bus deadlocking the transmit path. |
188 | * | 188 | * |
189 | * Quite hairy but the chip simply wasn't designed for SMP and you can't | 189 | * Quite hairy but the chip simply wasn't designed for SMP and you can't |
190 | * even ACK an interrupt without risking corrupting other parallel | 190 | * even ACK an interrupt without risking corrupting other parallel |
191 | * activities on the chip." [lkml, 25 Jul 2007] | 191 | * activities on the chip." [lkml, 25 Jul 2007] |
@@ -553,7 +553,6 @@ static void __ei_poll(struct net_device *dev) | |||
553 | static void ei_tx_err(struct net_device *dev) | 553 | static void ei_tx_err(struct net_device *dev) |
554 | { | 554 | { |
555 | unsigned long e8390_base = dev->base_addr; | 555 | unsigned long e8390_base = dev->base_addr; |
556 | struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); | ||
557 | unsigned char txsr = ei_inb_p(e8390_base+EN0_TSR); | 556 | unsigned char txsr = ei_inb_p(e8390_base+EN0_TSR); |
558 | unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU); | 557 | unsigned char tx_was_aborted = txsr & (ENTSR_ABT+ENTSR_FU); |
559 | 558 | ||
@@ -816,7 +815,6 @@ static void ei_rx_overrun(struct net_device *dev) | |||
816 | { | 815 | { |
817 | unsigned long e8390_base = dev->base_addr; | 816 | unsigned long e8390_base = dev->base_addr; |
818 | unsigned char was_txing, must_resend = 0; | 817 | unsigned char was_txing, must_resend = 0; |
819 | struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); | ||
820 | 818 | ||
821 | /* | 819 | /* |
822 | * Record whether a Tx was in progress and then issue the | 820 | * Record whether a Tx was in progress and then issue the |