diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-24 13:15:13 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-09-24 13:15:13 -0400 |
commit | a319a2773a13bab56a0d0b3744ba8703324313b5 (patch) | |
tree | f02c86acabd1031439fd422a167784007e84ebb1 /drivers/net/hamachi.c | |
parent | e18fa700c9a31360bc8f193aa543b7ef7b39a06b (diff) | |
parent | 183798799216fad36c7219fe8d4d6dee6b8fa755 (diff) |
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6
* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6: (217 commits)
net/ieee80211: fix more crypto-related build breakage
[PATCH] Spidernet: add ethtool -S (show statistics)
[NET] GT96100: Delete bitrotting ethernet driver
[PATCH] mv643xx_eth: restrict to 32-bit PPC_MULTIPLATFORM
[PATCH] Cirrus Logic ep93xx ethernet driver
r8169: the MMIO region of the 8167 stands behin BAR#1
e1000, ixgb: Remove pointless wrappers
[PATCH] Remove powerpc specific parts of 3c509 driver
[PATCH] s2io: Switch to pci_get_device
[PATCH] gt96100: move to pci_get_device API
[PATCH] ehea: bugfix for register access functions
[PATCH] e1000 disable device on PCI error
drivers/net/phy/fixed: #if 0 some incomplete code
drivers/net: const-ify ethtool_ops declarations
[PATCH] ethtool: allow const ethtool_ops
[PATCH] sky2: big endian
[PATCH] sky2: fiber support
[PATCH] sky2: tx pause bug fix
drivers/net: Trim trailing whitespace
[PATCH] ehea: IBM eHEA Ethernet Device Driver
...
Manually resolved conflicts in drivers/net/ixgb/ixgb_main.c and
drivers/net/sky2.c related to CHECKSUM_HW/CHECKSUM_PARTIAL changes by
commit 84fa7933a33f806bbbaae6775e87459b1ec584c0 that just happened to be
next to unrelated changes in this update.
Diffstat (limited to 'drivers/net/hamachi.c')
-rw-r--r-- | drivers/net/hamachi.c | 240 |
1 files changed, 119 insertions, 121 deletions
diff --git a/drivers/net/hamachi.c b/drivers/net/hamachi.c index 763373ae966..5c89ae78a51 100644 --- a/drivers/net/hamachi.c +++ b/drivers/net/hamachi.c | |||
@@ -3,7 +3,7 @@ | |||
3 | Written 1998-2000 by Donald Becker. | 3 | Written 1998-2000 by Donald Becker. |
4 | Updates 2000 by Keith Underwood. | 4 | Updates 2000 by Keith Underwood. |
5 | 5 | ||
6 | This software may be used and distributed according to the terms of | 6 | This software may be used and distributed according to the terms of |
7 | the GNU General Public License (GPL), incorporated herein by reference. | 7 | the GNU General Public License (GPL), incorporated herein by reference. |
8 | Drivers based on or derived from this code fall under the GPL and must | 8 | Drivers based on or derived from this code fall under the GPL and must |
9 | retain the authorship, copyright and license notice. This file is not | 9 | retain the authorship, copyright and license notice. This file is not |
@@ -27,8 +27,8 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | #define DRV_NAME "hamachi" | 29 | #define DRV_NAME "hamachi" |
30 | #define DRV_VERSION "2.0" | 30 | #define DRV_VERSION "2.1" |
31 | #define DRV_RELDATE "June 27, 2006" | 31 | #define DRV_RELDATE "Sept 11, 2006" |
32 | 32 | ||
33 | 33 | ||
34 | /* A few user-configurable values. */ | 34 | /* A few user-configurable values. */ |
@@ -46,7 +46,7 @@ static int mtu; | |||
46 | static int max_rx_latency = 0x11; | 46 | static int max_rx_latency = 0x11; |
47 | static int max_rx_gap = 0x05; | 47 | static int max_rx_gap = 0x05; |
48 | static int min_rx_pkt = 0x18; | 48 | static int min_rx_pkt = 0x18; |
49 | static int max_tx_latency = 0x00; | 49 | static int max_tx_latency = 0x00; |
50 | static int max_tx_gap = 0x00; | 50 | static int max_tx_gap = 0x00; |
51 | static int min_tx_pkt = 0x30; | 51 | static int min_tx_pkt = 0x30; |
52 | 52 | ||
@@ -76,7 +76,7 @@ static int force32; | |||
76 | - The next bit can be used to force half-duplex. This is a bad | 76 | - The next bit can be used to force half-duplex. This is a bad |
77 | idea since no known implementations implement half-duplex, and, | 77 | idea since no known implementations implement half-duplex, and, |
78 | in general, half-duplex for gigabit ethernet is a bad idea. | 78 | in general, half-duplex for gigabit ethernet is a bad idea. |
79 | 0x00000080 : Force half-duplex | 79 | 0x00000080 : Force half-duplex |
80 | Default is full-duplex. | 80 | Default is full-duplex. |
81 | - In the original driver, the ninth bit could be used to force | 81 | - In the original driver, the ninth bit could be used to force |
82 | full-duplex. Maintain that for compatibility | 82 | full-duplex. Maintain that for compatibility |
@@ -87,7 +87,7 @@ static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; | |||
87 | static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; | 87 | static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; |
88 | /* The Hamachi chipset supports 3 parameters each for Rx and Tx | 88 | /* The Hamachi chipset supports 3 parameters each for Rx and Tx |
89 | * interruput management. Parameters will be loaded as specified into | 89 | * interruput management. Parameters will be loaded as specified into |
90 | * the TxIntControl and RxIntControl registers. | 90 | * the TxIntControl and RxIntControl registers. |
91 | * | 91 | * |
92 | * The registers are arranged as follows: | 92 | * The registers are arranged as follows: |
93 | * 23 - 16 15 - 8 7 - 0 | 93 | * 23 - 16 15 - 8 7 - 0 |
@@ -95,10 +95,10 @@ static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; | |||
95 | * | min_pkt | max_gap | max_latency | | 95 | * | min_pkt | max_gap | max_latency | |
96 | * --------------------------------- | 96 | * --------------------------------- |
97 | * min_pkt : The minimum number of packets processed between | 97 | * min_pkt : The minimum number of packets processed between |
98 | * interrupts. | 98 | * interrupts. |
99 | * max_gap : The maximum inter-packet gap in units of 8.192 us | 99 | * max_gap : The maximum inter-packet gap in units of 8.192 us |
100 | * max_latency : The absolute time between interrupts in units of 8.192 us | 100 | * max_latency : The absolute time between interrupts in units of 8.192 us |
101 | * | 101 | * |
102 | */ | 102 | */ |
103 | static int rx_params[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; | 103 | static int rx_params[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; |
104 | static int tx_params[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; | 104 | static int tx_params[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1}; |
@@ -183,7 +183,7 @@ KERN_INFO " Further modifications by Keith Underwood <keithu@parl.clemson.edu> | |||
183 | other linux headers causing many compiler warnings. | 183 | other linux headers causing many compiler warnings. |
184 | */ | 184 | */ |
185 | #ifndef IP_MF | 185 | #ifndef IP_MF |
186 | #define IP_MF 0x2000 /* IP more frags from <netinet/ip.h> */ | 186 | #define IP_MF 0x2000 /* IP more frags from <netinet/ip.h> */ |
187 | #endif | 187 | #endif |
188 | 188 | ||
189 | /* Define IP_OFFSET to be IPOPT_OFFSET */ | 189 | /* Define IP_OFFSET to be IPOPT_OFFSET */ |
@@ -204,9 +204,9 @@ KERN_INFO " Further modifications by Keith Underwood <keithu@parl.clemson.edu> | |||
204 | /* Condensed bus+endian portability operations. */ | 204 | /* Condensed bus+endian portability operations. */ |
205 | #if ADDRLEN == 64 | 205 | #if ADDRLEN == 64 |
206 | #define cpu_to_leXX(addr) cpu_to_le64(addr) | 206 | #define cpu_to_leXX(addr) cpu_to_le64(addr) |
207 | #else | 207 | #else |
208 | #define cpu_to_leXX(addr) cpu_to_le32(addr) | 208 | #define cpu_to_leXX(addr) cpu_to_le32(addr) |
209 | #endif | 209 | #endif |
210 | 210 | ||
211 | 211 | ||
212 | /* | 212 | /* |
@@ -291,30 +291,30 @@ Hamachi Engineering Design Specification, 5/15/97 | |||
291 | 291 | ||
292 | IVc. Errata | 292 | IVc. Errata |
293 | 293 | ||
294 | None noted. | 294 | None noted. |
295 | 295 | ||
296 | V. Recent Changes | 296 | V. Recent Changes |
297 | 297 | ||
298 | 01/15/1999 EPK Enlargement of the TX and RX ring sizes. This appears | 298 | 01/15/1999 EPK Enlargement of the TX and RX ring sizes. This appears |
299 | to help avoid some stall conditions -- this needs further research. | 299 | to help avoid some stall conditions -- this needs further research. |
300 | 300 | ||
301 | 01/15/1999 EPK Creation of the hamachi_tx function. This function cleans | 301 | 01/15/1999 EPK Creation of the hamachi_tx function. This function cleans |
302 | the Tx ring and is called from hamachi_start_xmit (this used to be | 302 | the Tx ring and is called from hamachi_start_xmit (this used to be |
303 | called from hamachi_interrupt but it tends to delay execution of the | 303 | called from hamachi_interrupt but it tends to delay execution of the |
304 | interrupt handler and thus reduce bandwidth by reducing the latency | 304 | interrupt handler and thus reduce bandwidth by reducing the latency |
305 | between hamachi_rx()'s). Notably, some modification has been made so | 305 | between hamachi_rx()'s). Notably, some modification has been made so |
306 | that the cleaning loop checks only to make sure that the DescOwn bit | 306 | that the cleaning loop checks only to make sure that the DescOwn bit |
307 | isn't set in the status flag since the card is not required | 307 | isn't set in the status flag since the card is not required |
308 | to set the entire flag to zero after processing. | 308 | to set the entire flag to zero after processing. |
309 | 309 | ||
310 | 01/15/1999 EPK In the hamachi_start_tx function, the Tx ring full flag is | 310 | 01/15/1999 EPK In the hamachi_start_tx function, the Tx ring full flag is |
311 | checked before attempting to add a buffer to the ring. If the ring is full | 311 | checked before attempting to add a buffer to the ring. If the ring is full |
312 | an attempt is made to free any dirty buffers and thus find space for | 312 | an attempt is made to free any dirty buffers and thus find space for |
313 | the new buffer or the function returns non-zero which should case the | 313 | the new buffer or the function returns non-zero which should case the |
314 | scheduler to reschedule the buffer later. | 314 | scheduler to reschedule the buffer later. |
315 | 315 | ||
316 | 01/15/1999 EPK Some adjustments were made to the chip initialization. | 316 | 01/15/1999 EPK Some adjustments were made to the chip initialization. |
317 | End-to-end flow control should now be fully active and the interrupt | 317 | End-to-end flow control should now be fully active and the interrupt |
318 | algorithm vars have been changed. These could probably use further tuning. | 318 | algorithm vars have been changed. These could probably use further tuning. |
319 | 319 | ||
320 | 01/15/1999 EPK Added the max_{rx,tx}_latency options. These are used to | 320 | 01/15/1999 EPK Added the max_{rx,tx}_latency options. These are used to |
@@ -322,7 +322,7 @@ V. Recent Changes | |||
322 | problems with network stalls, try setting these to higher values. | 322 | problems with network stalls, try setting these to higher values. |
323 | Valid values are 0x00 through 0xff. | 323 | Valid values are 0x00 through 0xff. |
324 | 324 | ||
325 | 01/15/1999 EPK In general, the overall bandwidth has increased and | 325 | 01/15/1999 EPK In general, the overall bandwidth has increased and |
326 | latencies are better (sometimes by a factor of 2). Stalls are rare at | 326 | latencies are better (sometimes by a factor of 2). Stalls are rare at |
327 | this point, however there still appears to be a bug somewhere between the | 327 | this point, however there still appears to be a bug somewhere between the |
328 | hardware and driver. TCP checksum errors under load also appear to be | 328 | hardware and driver. TCP checksum errors under load also appear to be |
@@ -334,20 +334,20 @@ V. Recent Changes | |||
334 | rings was typically getting set correctly, but the Tx ring wasn't getting | 334 | rings was typically getting set correctly, but the Tx ring wasn't getting |
335 | the DescEndRing bit set during initialization. ??? Does this mean the | 335 | the DescEndRing bit set during initialization. ??? Does this mean the |
336 | hamachi card is using the DescEndRing in processing even if a particular | 336 | hamachi card is using the DescEndRing in processing even if a particular |
337 | slot isn't in use -- hypothetically, the card might be searching the | 337 | slot isn't in use -- hypothetically, the card might be searching the |
338 | entire Tx ring for slots with the DescOwn bit set and then processing | 338 | entire Tx ring for slots with the DescOwn bit set and then processing |
339 | them. If the DescEndRing bit isn't set, then it might just wander off | 339 | them. If the DescEndRing bit isn't set, then it might just wander off |
340 | through memory until it hits a chunk of data with that bit set | 340 | through memory until it hits a chunk of data with that bit set |
341 | and then looping back. | 341 | and then looping back. |
342 | 342 | ||
343 | 02/09/1999 EPK Added Michel Mueller's TxDMA Interrupt and Tx-timeout | 343 | 02/09/1999 EPK Added Michel Mueller's TxDMA Interrupt and Tx-timeout |
344 | problem (TxCmd and RxCmd need only to be set when idle or stopped. | 344 | problem (TxCmd and RxCmd need only to be set when idle or stopped. |
345 | 345 | ||
346 | 02/09/1999 EPK Added code to check/reset dev->tbusy in hamachi_interrupt. | 346 | 02/09/1999 EPK Added code to check/reset dev->tbusy in hamachi_interrupt. |
347 | (Michel Mueller pointed out the ``permanently busy'' potential | 347 | (Michel Mueller pointed out the ``permanently busy'' potential |
348 | problem here). | 348 | problem here). |
349 | 349 | ||
350 | 02/22/1999 EPK Added Pete Wyckoff's ioctl to control the Tx/Rx latencies. | 350 | 02/22/1999 EPK Added Pete Wyckoff's ioctl to control the Tx/Rx latencies. |
351 | 351 | ||
352 | 02/23/1999 EPK Verified that the interrupt status field bits for Tx were | 352 | 02/23/1999 EPK Verified that the interrupt status field bits for Tx were |
353 | incorrectly defined and corrected (as per Michel Mueller). | 353 | incorrectly defined and corrected (as per Michel Mueller). |
@@ -363,7 +363,7 @@ V. Recent Changes | |||
363 | 363 | ||
364 | 02/20/2000 KDU Some of the control was just plain odd. Cleaned up the | 364 | 02/20/2000 KDU Some of the control was just plain odd. Cleaned up the |
365 | hamachi_start_xmit() and hamachi_interrupt() code. There is still some | 365 | hamachi_start_xmit() and hamachi_interrupt() code. There is still some |
366 | re-structuring I would like to do. | 366 | re-structuring I would like to do. |
367 | 367 | ||
368 | 03/01/2000 KDU Experimenting with a WIDE range of interrupt mitigation | 368 | 03/01/2000 KDU Experimenting with a WIDE range of interrupt mitigation |
369 | parameters on a dual P3-450 setup yielded the new default interrupt | 369 | parameters on a dual P3-450 setup yielded the new default interrupt |
@@ -371,25 +371,25 @@ mitigation parameters. Tx should interrupt VERY infrequently due to | |||
371 | Eric's scheme. Rx should be more often... | 371 | Eric's scheme. Rx should be more often... |
372 | 372 | ||
373 | 03/13/2000 KDU Added a patch to make the Rx Checksum code interact | 373 | 03/13/2000 KDU Added a patch to make the Rx Checksum code interact |
374 | nicely with non-linux machines. | 374 | nicely with non-linux machines. |
375 | 375 | ||
376 | 03/13/2000 KDU Experimented with some of the configuration values: | 376 | 03/13/2000 KDU Experimented with some of the configuration values: |
377 | 377 | ||
378 | -It seems that enabling PCI performance commands for descriptors | 378 | -It seems that enabling PCI performance commands for descriptors |
379 | (changing RxDMACtrl and TxDMACtrl lower nibble from 5 to D) has minimal | 379 | (changing RxDMACtrl and TxDMACtrl lower nibble from 5 to D) has minimal |
380 | performance impact for any of my tests. (ttcp, netpipe, netperf) I will | 380 | performance impact for any of my tests. (ttcp, netpipe, netperf) I will |
381 | leave them that way until I hear further feedback. | 381 | leave them that way until I hear further feedback. |
382 | 382 | ||
383 | -Increasing the PCI_LATENCY_TIMER to 130 | 383 | -Increasing the PCI_LATENCY_TIMER to 130 |
384 | (2 + (burst size of 128 * (0 wait states + 1))) seems to slightly | 384 | (2 + (burst size of 128 * (0 wait states + 1))) seems to slightly |
385 | degrade performance. Leaving default at 64 pending further information. | 385 | degrade performance. Leaving default at 64 pending further information. |
386 | 386 | ||
387 | 03/14/2000 KDU Further tuning: | 387 | 03/14/2000 KDU Further tuning: |
388 | 388 | ||
389 | -adjusted boguscnt in hamachi_rx() to depend on interrupt | 389 | -adjusted boguscnt in hamachi_rx() to depend on interrupt |
390 | mitigation parameters chosen. | 390 | mitigation parameters chosen. |
391 | 391 | ||
392 | -Selected a set of interrupt parameters based on some extensive testing. | 392 | -Selected a set of interrupt parameters based on some extensive testing. |
393 | These may change with more testing. | 393 | These may change with more testing. |
394 | 394 | ||
395 | TO DO: | 395 | TO DO: |
@@ -398,14 +398,14 @@ TO DO: | |||
398 | PCI_COMMAND_INVALIDATE. Set maximum burst size to cache line size in | 398 | PCI_COMMAND_INVALIDATE. Set maximum burst size to cache line size in |
399 | that case. | 399 | that case. |
400 | 400 | ||
401 | -fix the reset procedure. It doesn't quite work. | 401 | -fix the reset procedure. It doesn't quite work. |
402 | */ | 402 | */ |
403 | 403 | ||
404 | /* A few values that may be tweaked. */ | 404 | /* A few values that may be tweaked. */ |
405 | /* Size of each temporary Rx buffer, calculated as: | 405 | /* Size of each temporary Rx buffer, calculated as: |
406 | * 1518 bytes (ethernet packet) + 2 bytes (to get 8 byte alignment for | 406 | * 1518 bytes (ethernet packet) + 2 bytes (to get 8 byte alignment for |
407 | * the card) + 8 bytes of status info + 8 bytes for the Rx Checksum + | 407 | * the card) + 8 bytes of status info + 8 bytes for the Rx Checksum + |
408 | * 2 more because we use skb_reserve. | 408 | * 2 more because we use skb_reserve. |
409 | */ | 409 | */ |
410 | #define PKT_BUF_SZ 1538 | 410 | #define PKT_BUF_SZ 1538 |
411 | 411 | ||
@@ -465,7 +465,7 @@ enum intr_status_bits { | |||
465 | 465 | ||
466 | /* The Hamachi Rx and Tx buffer descriptors. */ | 466 | /* The Hamachi Rx and Tx buffer descriptors. */ |
467 | struct hamachi_desc { | 467 | struct hamachi_desc { |
468 | u32 status_n_length; | 468 | u32 status_n_length; |
469 | #if ADDRLEN == 64 | 469 | #if ADDRLEN == 64 |
470 | u32 pad; | 470 | u32 pad; |
471 | u64 addr; | 471 | u64 addr; |
@@ -476,7 +476,7 @@ struct hamachi_desc { | |||
476 | 476 | ||
477 | /* Bits in hamachi_desc.status_n_length */ | 477 | /* Bits in hamachi_desc.status_n_length */ |
478 | enum desc_status_bits { | 478 | enum desc_status_bits { |
479 | DescOwn=0x80000000, DescEndPacket=0x40000000, DescEndRing=0x20000000, | 479 | DescOwn=0x80000000, DescEndPacket=0x40000000, DescEndRing=0x20000000, |
480 | DescIntr=0x10000000, | 480 | DescIntr=0x10000000, |
481 | }; | 481 | }; |
482 | 482 | ||
@@ -546,7 +546,7 @@ MODULE_PARM_DESC(tx_params, "GNIC-II min_tx_pkt+max_tx_gap+max_tx_latency"); | |||
546 | MODULE_PARM_DESC(options, "GNIC-II Bits 0-3: media type, bits 4-6: as force32, bit 7: half duplex, bit 9 full duplex"); | 546 | MODULE_PARM_DESC(options, "GNIC-II Bits 0-3: media type, bits 4-6: as force32, bit 7: half duplex, bit 9 full duplex"); |
547 | MODULE_PARM_DESC(full_duplex, "GNIC-II full duplex setting(s) (1)"); | 547 | MODULE_PARM_DESC(full_duplex, "GNIC-II full duplex setting(s) (1)"); |
548 | MODULE_PARM_DESC(force32, "GNIC-II: Bit 0: 32 bit PCI, bit 1: disable parity, bit 2: 64 bit PCI (all boards)"); | 548 | MODULE_PARM_DESC(force32, "GNIC-II: Bit 0: 32 bit PCI, bit 1: disable parity, bit 2: 64 bit PCI (all boards)"); |
549 | 549 | ||
550 | static int read_eeprom(void __iomem *ioaddr, int location); | 550 | static int read_eeprom(void __iomem *ioaddr, int location); |
551 | static int mdio_read(struct net_device *dev, int phy_id, int location); | 551 | static int mdio_read(struct net_device *dev, int phy_id, int location); |
552 | static void mdio_write(struct net_device *dev, int phy_id, int location, int value); | 552 | static void mdio_write(struct net_device *dev, int phy_id, int location, int value); |
@@ -563,8 +563,8 @@ static void hamachi_error(struct net_device *dev, int intr_status); | |||
563 | static int hamachi_close(struct net_device *dev); | 563 | static int hamachi_close(struct net_device *dev); |
564 | static struct net_device_stats *hamachi_get_stats(struct net_device *dev); | 564 | static struct net_device_stats *hamachi_get_stats(struct net_device *dev); |
565 | static void set_rx_mode(struct net_device *dev); | 565 | static void set_rx_mode(struct net_device *dev); |
566 | static struct ethtool_ops ethtool_ops; | 566 | static const struct ethtool_ops ethtool_ops; |
567 | static struct ethtool_ops ethtool_ops_no_mii; | 567 | static const struct ethtool_ops ethtool_ops_no_mii; |
568 | 568 | ||
569 | static int __devinit hamachi_init_one (struct pci_dev *pdev, | 569 | static int __devinit hamachi_init_one (struct pci_dev *pdev, |
570 | const struct pci_device_id *ent) | 570 | const struct pci_device_id *ent) |
@@ -659,7 +659,7 @@ static int __devinit hamachi_init_one (struct pci_dev *pdev, | |||
659 | option = dev->mem_start; | 659 | option = dev->mem_start; |
660 | 660 | ||
661 | /* If the bus size is misidentified, do the following. */ | 661 | /* If the bus size is misidentified, do the following. */ |
662 | force32 = force32 ? force32 : | 662 | force32 = force32 ? force32 : |
663 | ((option >= 0) ? ((option & 0x00000070) >> 4) : 0 ); | 663 | ((option >= 0) ? ((option & 0x00000070) >> 4) : 0 ); |
664 | if (force32) | 664 | if (force32) |
665 | writeb(force32, ioaddr + VirtualJumpers); | 665 | writeb(force32, ioaddr + VirtualJumpers); |
@@ -671,11 +671,11 @@ static int __devinit hamachi_init_one (struct pci_dev *pdev, | |||
671 | * be valid for a moment. Wait for a little while until it is. If | 671 | * be valid for a moment. Wait for a little while until it is. If |
672 | * it takes more than 10ms, forget it. | 672 | * it takes more than 10ms, forget it. |
673 | */ | 673 | */ |
674 | udelay(10); | 674 | udelay(10); |
675 | i = readb(ioaddr + PCIClkMeas); | 675 | i = readb(ioaddr + PCIClkMeas); |
676 | for (boguscnt = 0; (!(i & 0x080)) && boguscnt < 1000; boguscnt++){ | 676 | for (boguscnt = 0; (!(i & 0x080)) && boguscnt < 1000; boguscnt++){ |
677 | udelay(10); | 677 | udelay(10); |
678 | i = readb(ioaddr + PCIClkMeas); | 678 | i = readb(ioaddr + PCIClkMeas); |
679 | } | 679 | } |
680 | 680 | ||
681 | hmp->base = ioaddr; | 681 | hmp->base = ioaddr; |
@@ -714,9 +714,9 @@ static int __devinit hamachi_init_one (struct pci_dev *pdev, | |||
714 | 714 | ||
715 | rx_int_var = card_idx < MAX_UNITS ? rx_params[card_idx] : -1; | 715 | rx_int_var = card_idx < MAX_UNITS ? rx_params[card_idx] : -1; |
716 | tx_int_var = card_idx < MAX_UNITS ? tx_params[card_idx] : -1; | 716 | tx_int_var = card_idx < MAX_UNITS ? tx_params[card_idx] : -1; |
717 | hmp->rx_int_var = rx_int_var >= 0 ? rx_int_var : | 717 | hmp->rx_int_var = rx_int_var >= 0 ? rx_int_var : |
718 | (min_rx_pkt << 16 | max_rx_gap << 8 | max_rx_latency); | 718 | (min_rx_pkt << 16 | max_rx_gap << 8 | max_rx_latency); |
719 | hmp->tx_int_var = tx_int_var >= 0 ? tx_int_var : | 719 | hmp->tx_int_var = tx_int_var >= 0 ? tx_int_var : |
720 | (min_tx_pkt << 16 | max_tx_gap << 8 | max_tx_latency); | 720 | (min_tx_pkt << 16 | max_tx_gap << 8 | max_tx_latency); |
721 | 721 | ||
722 | 722 | ||
@@ -783,10 +783,10 @@ static int __devinit hamachi_init_one (struct pci_dev *pdev, | |||
783 | return 0; | 783 | return 0; |
784 | 784 | ||
785 | err_out_unmap_rx: | 785 | err_out_unmap_rx: |
786 | pci_free_consistent(pdev, RX_TOTAL_SIZE, hmp->rx_ring, | 786 | pci_free_consistent(pdev, RX_TOTAL_SIZE, hmp->rx_ring, |
787 | hmp->rx_ring_dma); | 787 | hmp->rx_ring_dma); |
788 | err_out_unmap_tx: | 788 | err_out_unmap_tx: |
789 | pci_free_consistent(pdev, TX_TOTAL_SIZE, hmp->tx_ring, | 789 | pci_free_consistent(pdev, TX_TOTAL_SIZE, hmp->tx_ring, |
790 | hmp->tx_ring_dma); | 790 | hmp->tx_ring_dma); |
791 | err_out_cleardev: | 791 | err_out_cleardev: |
792 | free_netdev (dev); | 792 | free_netdev (dev); |
@@ -856,7 +856,7 @@ static void mdio_write(struct net_device *dev, int phy_id, int location, int val | |||
856 | return; | 856 | return; |
857 | } | 857 | } |
858 | 858 | ||
859 | 859 | ||
860 | static int hamachi_open(struct net_device *dev) | 860 | static int hamachi_open(struct net_device *dev) |
861 | { | 861 | { |
862 | struct hamachi_private *hmp = netdev_priv(dev); | 862 | struct hamachi_private *hmp = netdev_priv(dev); |
@@ -886,7 +886,7 @@ static int hamachi_open(struct net_device *dev) | |||
886 | writel(cpu_to_le32(hmp->tx_ring_dma), ioaddr + TxPtr); | 886 | writel(cpu_to_le32(hmp->tx_ring_dma), ioaddr + TxPtr); |
887 | #endif | 887 | #endif |
888 | 888 | ||
889 | /* TODO: It would make sense to organize this as words since the card | 889 | /* TODO: It would make sense to organize this as words since the card |
890 | * documentation does. -KDU | 890 | * documentation does. -KDU |
891 | */ | 891 | */ |
892 | for (i = 0; i < 6; i++) | 892 | for (i = 0; i < 6; i++) |
@@ -898,36 +898,36 @@ static int hamachi_open(struct net_device *dev) | |||
898 | /* Configure the FIFO */ | 898 | /* Configure the FIFO */ |
899 | fifo_info = (readw(ioaddr + GPIO) & 0x00C0) >> 6; | 899 | fifo_info = (readw(ioaddr + GPIO) & 0x00C0) >> 6; |
900 | switch (fifo_info){ | 900 | switch (fifo_info){ |
901 | case 0 : | 901 | case 0 : |
902 | /* No FIFO */ | 902 | /* No FIFO */ |
903 | writew(0x0000, ioaddr + FIFOcfg); | 903 | writew(0x0000, ioaddr + FIFOcfg); |
904 | break; | 904 | break; |
905 | case 1 : | 905 | case 1 : |
906 | /* Configure the FIFO for 512K external, 16K used for Tx. */ | 906 | /* Configure the FIFO for 512K external, 16K used for Tx. */ |
907 | writew(0x0028, ioaddr + FIFOcfg); | 907 | writew(0x0028, ioaddr + FIFOcfg); |
908 | break; | 908 | break; |
909 | case 2 : | 909 | case 2 : |
910 | /* Configure the FIFO for 1024 external, 32K used for Tx. */ | 910 | /* Configure the FIFO for 1024 external, 32K used for Tx. */ |
911 | writew(0x004C, ioaddr + FIFOcfg); | 911 | writew(0x004C, ioaddr + FIFOcfg); |
912 | break; | 912 | break; |
913 | case 3 : | 913 | case 3 : |
914 | /* Configure the FIFO for 2048 external, 32K used for Tx. */ | 914 | /* Configure the FIFO for 2048 external, 32K used for Tx. */ |
915 | writew(0x006C, ioaddr + FIFOcfg); | 915 | writew(0x006C, ioaddr + FIFOcfg); |
916 | break; | 916 | break; |
917 | default : | 917 | default : |
918 | printk(KERN_WARNING "%s: Unsupported external memory config!\n", | 918 | printk(KERN_WARNING "%s: Unsupported external memory config!\n", |
919 | dev->name); | 919 | dev->name); |
920 | /* Default to no FIFO */ | 920 | /* Default to no FIFO */ |
921 | writew(0x0000, ioaddr + FIFOcfg); | 921 | writew(0x0000, ioaddr + FIFOcfg); |
922 | break; | 922 | break; |
923 | } | 923 | } |
924 | 924 | ||
925 | if (dev->if_port == 0) | 925 | if (dev->if_port == 0) |
926 | dev->if_port = hmp->default_port; | 926 | dev->if_port = hmp->default_port; |
927 | 927 | ||
928 | 928 | ||
929 | /* Setting the Rx mode will start the Rx process. */ | 929 | /* Setting the Rx mode will start the Rx process. */ |
930 | /* If someone didn't choose a duplex, default to full-duplex */ | 930 | /* If someone didn't choose a duplex, default to full-duplex */ |
931 | if (hmp->duplex_lock != 1) | 931 | if (hmp->duplex_lock != 1) |
932 | hmp->mii_if.full_duplex = 1; | 932 | hmp->mii_if.full_duplex = 1; |
933 | 933 | ||
@@ -940,7 +940,7 @@ static int hamachi_open(struct net_device *dev) | |||
940 | #endif | 940 | #endif |
941 | writew(0x8000, ioaddr + MACCnfg); /* Soft reset the MAC */ | 941 | writew(0x8000, ioaddr + MACCnfg); /* Soft reset the MAC */ |
942 | writew(0x215F, ioaddr + MACCnfg); | 942 | writew(0x215F, ioaddr + MACCnfg); |
943 | writew(0x000C, ioaddr + FrameGap0); | 943 | writew(0x000C, ioaddr + FrameGap0); |
944 | /* WHAT?!?!? Why isn't this documented somewhere? -KDU */ | 944 | /* WHAT?!?!? Why isn't this documented somewhere? -KDU */ |
945 | writew(0x1018, ioaddr + FrameGap1); | 945 | writew(0x1018, ioaddr + FrameGap1); |
946 | /* Why do we enable receives/transmits here? -KDU */ | 946 | /* Why do we enable receives/transmits here? -KDU */ |
@@ -962,16 +962,16 @@ static int hamachi_open(struct net_device *dev) | |||
962 | 962 | ||
963 | if (hamachi_debug > 1) { | 963 | if (hamachi_debug > 1) { |
964 | printk("max_tx_latency: %d, max_tx_gap: %d, min_tx_pkt: %d\n", | 964 | printk("max_tx_latency: %d, max_tx_gap: %d, min_tx_pkt: %d\n", |
965 | tx_int_var & 0x00ff, (tx_int_var & 0x00ff00) >> 8, | 965 | tx_int_var & 0x00ff, (tx_int_var & 0x00ff00) >> 8, |
966 | (tx_int_var & 0x00ff0000) >> 16); | 966 | (tx_int_var & 0x00ff0000) >> 16); |
967 | printk("max_rx_latency: %d, max_rx_gap: %d, min_rx_pkt: %d\n", | 967 | printk("max_rx_latency: %d, max_rx_gap: %d, min_rx_pkt: %d\n", |
968 | rx_int_var & 0x00ff, (rx_int_var & 0x00ff00) >> 8, | 968 | rx_int_var & 0x00ff, (rx_int_var & 0x00ff00) >> 8, |
969 | (rx_int_var & 0x00ff0000) >> 16); | 969 | (rx_int_var & 0x00ff0000) >> 16); |
970 | printk("rx_int_var: %x, tx_int_var: %x\n", rx_int_var, tx_int_var); | 970 | printk("rx_int_var: %x, tx_int_var: %x\n", rx_int_var, tx_int_var); |
971 | } | 971 | } |
972 | 972 | ||
973 | writel(tx_int_var, ioaddr + TxIntrCtrl); | 973 | writel(tx_int_var, ioaddr + TxIntrCtrl); |
974 | writel(rx_int_var, ioaddr + RxIntrCtrl); | 974 | writel(rx_int_var, ioaddr + RxIntrCtrl); |
975 | 975 | ||
976 | set_rx_mode(dev); | 976 | set_rx_mode(dev); |
977 | 977 | ||
@@ -1016,21 +1016,21 @@ static inline int hamachi_tx(struct net_device *dev) | |||
1016 | int entry = hmp->dirty_tx % TX_RING_SIZE; | 1016 | int entry = hmp->dirty_tx % TX_RING_SIZE; |
1017 | struct sk_buff *skb; | 1017 | struct sk_buff *skb; |
1018 | 1018 | ||
1019 | if (hmp->tx_ring[entry].status_n_length & cpu_to_le32(DescOwn)) | 1019 | if (hmp->tx_ring[entry].status_n_length & cpu_to_le32(DescOwn)) |
1020 | break; | 1020 | break; |
1021 | /* Free the original skb. */ | 1021 | /* Free the original skb. */ |
1022 | skb = hmp->tx_skbuff[entry]; | 1022 | skb = hmp->tx_skbuff[entry]; |
1023 | if (skb != 0) { | 1023 | if (skb != 0) { |
1024 | pci_unmap_single(hmp->pci_dev, | 1024 | pci_unmap_single(hmp->pci_dev, |
1025 | hmp->tx_ring[entry].addr, skb->len, | 1025 | hmp->tx_ring[entry].addr, skb->len, |
1026 | PCI_DMA_TODEVICE); | 1026 | PCI_DMA_TODEVICE); |
1027 | dev_kfree_skb(skb); | 1027 | dev_kfree_skb(skb); |
1028 | hmp->tx_skbuff[entry] = NULL; | 1028 | hmp->tx_skbuff[entry] = NULL; |
1029 | } | 1029 | } |
1030 | hmp->tx_ring[entry].status_n_length = 0; | 1030 | hmp->tx_ring[entry].status_n_length = 0; |
1031 | if (entry >= TX_RING_SIZE-1) | 1031 | if (entry >= TX_RING_SIZE-1) |
1032 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= | 1032 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= |
1033 | cpu_to_le32(DescEndRing); | 1033 | cpu_to_le32(DescEndRing); |
1034 | hmp->stats.tx_packets++; | 1034 | hmp->stats.tx_packets++; |
1035 | } | 1035 | } |
1036 | 1036 | ||
@@ -1082,7 +1082,7 @@ static void hamachi_tx_timeout(struct net_device *dev) | |||
1082 | printk("\n"); | 1082 | printk("\n"); |
1083 | } | 1083 | } |
1084 | 1084 | ||
1085 | /* Reinit the hardware and make sure the Rx and Tx processes | 1085 | /* Reinit the hardware and make sure the Rx and Tx processes |
1086 | are up and running. | 1086 | are up and running. |
1087 | */ | 1087 | */ |
1088 | dev->if_port = 0; | 1088 | dev->if_port = 0; |
@@ -1092,7 +1092,7 @@ static void hamachi_tx_timeout(struct net_device *dev) | |||
1092 | * -Turn off MAC receiver | 1092 | * -Turn off MAC receiver |
1093 | * -Issue Reset | 1093 | * -Issue Reset |
1094 | */ | 1094 | */ |
1095 | 1095 | ||
1096 | for (i = 0; i < RX_RING_SIZE; i++) | 1096 | for (i = 0; i < RX_RING_SIZE; i++) |
1097 | hmp->rx_ring[i].status_n_length &= cpu_to_le32(~DescOwn); | 1097 | hmp->rx_ring[i].status_n_length &= cpu_to_le32(~DescOwn); |
1098 | 1098 | ||
@@ -1106,11 +1106,11 @@ static void hamachi_tx_timeout(struct net_device *dev) | |||
1106 | hmp->tx_ring[i].status_n_length = cpu_to_le32( | 1106 | hmp->tx_ring[i].status_n_length = cpu_to_le32( |
1107 | DescEndRing | | 1107 | DescEndRing | |
1108 | (hmp->tx_ring[i].status_n_length & 0x0000FFFF)); | 1108 | (hmp->tx_ring[i].status_n_length & 0x0000FFFF)); |
1109 | else | 1109 | else |
1110 | hmp->tx_ring[i].status_n_length &= 0x0000ffff; | 1110 | hmp->tx_ring[i].status_n_length &= 0x0000ffff; |
1111 | skb = hmp->tx_skbuff[i]; | 1111 | skb = hmp->tx_skbuff[i]; |
1112 | if (skb){ | 1112 | if (skb){ |
1113 | pci_unmap_single(hmp->pci_dev, hmp->tx_ring[i].addr, | 1113 | pci_unmap_single(hmp->pci_dev, hmp->tx_ring[i].addr, |
1114 | skb->len, PCI_DMA_TODEVICE); | 1114 | skb->len, PCI_DMA_TODEVICE); |
1115 | dev_kfree_skb(skb); | 1115 | dev_kfree_skb(skb); |
1116 | hmp->tx_skbuff[i] = NULL; | 1116 | hmp->tx_skbuff[i] = NULL; |
@@ -1119,20 +1119,20 @@ static void hamachi_tx_timeout(struct net_device *dev) | |||
1119 | 1119 | ||
1120 | udelay(60); /* Sleep 60 us just for safety sake */ | 1120 | udelay(60); /* Sleep 60 us just for safety sake */ |
1121 | writew(0x0002, ioaddr + RxCmd); /* STOP Rx */ | 1121 | writew(0x0002, ioaddr + RxCmd); /* STOP Rx */ |
1122 | 1122 | ||
1123 | writeb(0x01, ioaddr + ChipReset); /* Reinit the hardware */ | 1123 | writeb(0x01, ioaddr + ChipReset); /* Reinit the hardware */ |
1124 | 1124 | ||
1125 | hmp->tx_full = 0; | 1125 | hmp->tx_full = 0; |
1126 | hmp->cur_rx = hmp->cur_tx = 0; | 1126 | hmp->cur_rx = hmp->cur_tx = 0; |
1127 | hmp->dirty_rx = hmp->dirty_tx = 0; | 1127 | hmp->dirty_rx = hmp->dirty_tx = 0; |
1128 | /* Rx packets are also presumed lost; however, we need to make sure a | 1128 | /* Rx packets are also presumed lost; however, we need to make sure a |
1129 | * ring of buffers is in tact. -KDU | 1129 | * ring of buffers is in tact. -KDU |
1130 | */ | 1130 | */ |
1131 | for (i = 0; i < RX_RING_SIZE; i++){ | 1131 | for (i = 0; i < RX_RING_SIZE; i++){ |
1132 | struct sk_buff *skb = hmp->rx_skbuff[i]; | 1132 | struct sk_buff *skb = hmp->rx_skbuff[i]; |
1133 | 1133 | ||
1134 | if (skb){ | 1134 | if (skb){ |
1135 | pci_unmap_single(hmp->pci_dev, hmp->rx_ring[i].addr, | 1135 | pci_unmap_single(hmp->pci_dev, hmp->rx_ring[i].addr, |
1136 | hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1136 | hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
1137 | dev_kfree_skb(skb); | 1137 | dev_kfree_skb(skb); |
1138 | hmp->rx_skbuff[i] = NULL; | 1138 | hmp->rx_skbuff[i] = NULL; |
@@ -1146,9 +1146,9 @@ static void hamachi_tx_timeout(struct net_device *dev) | |||
1146 | break; | 1146 | break; |
1147 | skb->dev = dev; /* Mark as being used by this device. */ | 1147 | skb->dev = dev; /* Mark as being used by this device. */ |
1148 | skb_reserve(skb, 2); /* 16 byte align the IP header. */ | 1148 | skb_reserve(skb, 2); /* 16 byte align the IP header. */ |
1149 | hmp->rx_ring[i].addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, | 1149 | hmp->rx_ring[i].addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, |
1150 | skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE)); | 1150 | skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE)); |
1151 | hmp->rx_ring[i].status_n_length = cpu_to_le32(DescOwn | | 1151 | hmp->rx_ring[i].status_n_length = cpu_to_le32(DescOwn | |
1152 | DescEndPacket | DescIntr | (hmp->rx_buf_sz - 2)); | 1152 | DescEndPacket | DescIntr | (hmp->rx_buf_sz - 2)); |
1153 | } | 1153 | } |
1154 | hmp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); | 1154 | hmp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); |
@@ -1187,11 +1187,11 @@ static void hamachi_init_ring(struct net_device *dev) | |||
1187 | #endif | 1187 | #endif |
1188 | /* My attempt at a reasonable correction */ | 1188 | /* My attempt at a reasonable correction */ |
1189 | /* +26 gets the maximum ethernet encapsulation, +7 & ~7 because the | 1189 | /* +26 gets the maximum ethernet encapsulation, +7 & ~7 because the |
1190 | * card needs room to do 8 byte alignment, +2 so we can reserve | 1190 | * card needs room to do 8 byte alignment, +2 so we can reserve |
1191 | * the first 2 bytes, and +16 gets room for the status word from the | 1191 | * the first 2 bytes, and +16 gets room for the status word from the |
1192 | * card. -KDU | 1192 | * card. -KDU |
1193 | */ | 1193 | */ |
1194 | hmp->rx_buf_sz = (dev->mtu <= 1492 ? PKT_BUF_SZ : | 1194 | hmp->rx_buf_sz = (dev->mtu <= 1492 ? PKT_BUF_SZ : |
1195 | (((dev->mtu+26+7) & ~7) + 2 + 16)); | 1195 | (((dev->mtu+26+7) & ~7) + 2 + 16)); |
1196 | 1196 | ||
1197 | /* Initialize all Rx descriptors. */ | 1197 | /* Initialize all Rx descriptors. */ |
@@ -1207,10 +1207,10 @@ static void hamachi_init_ring(struct net_device *dev) | |||
1207 | break; | 1207 | break; |
1208 | skb->dev = dev; /* Mark as being used by this device. */ | 1208 | skb->dev = dev; /* Mark as being used by this device. */ |
1209 | skb_reserve(skb, 2); /* 16 byte align the IP header. */ | 1209 | skb_reserve(skb, 2); /* 16 byte align the IP header. */ |
1210 | hmp->rx_ring[i].addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, | 1210 | hmp->rx_ring[i].addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, |
1211 | skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE)); | 1211 | skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE)); |
1212 | /* -2 because it doesn't REALLY have that first 2 bytes -KDU */ | 1212 | /* -2 because it doesn't REALLY have that first 2 bytes -KDU */ |
1213 | hmp->rx_ring[i].status_n_length = cpu_to_le32(DescOwn | | 1213 | hmp->rx_ring[i].status_n_length = cpu_to_le32(DescOwn | |
1214 | DescEndPacket | DescIntr | (hmp->rx_buf_sz -2)); | 1214 | DescEndPacket | DescIntr | (hmp->rx_buf_sz -2)); |
1215 | } | 1215 | } |
1216 | hmp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); | 1216 | hmp->dirty_rx = (unsigned int)(i - RX_RING_SIZE); |
@@ -1267,7 +1267,7 @@ static int hamachi_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1267 | unsigned entry; | 1267 | unsigned entry; |
1268 | u16 status; | 1268 | u16 status; |
1269 | 1269 | ||
1270 | /* Ok, now make sure that the queue has space before trying to | 1270 | /* Ok, now make sure that the queue has space before trying to |
1271 | add another skbuff. if we return non-zero the scheduler | 1271 | add another skbuff. if we return non-zero the scheduler |
1272 | should interpret this as a queue full and requeue the buffer | 1272 | should interpret this as a queue full and requeue the buffer |
1273 | for later. | 1273 | for later. |
@@ -1282,7 +1282,7 @@ static int hamachi_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1282 | if( !(status & 0x0001) || (status & 0x0002)) | 1282 | if( !(status & 0x0001) || (status & 0x0002)) |
1283 | writew(0x0001, hmp->base + TxCmd); | 1283 | writew(0x0001, hmp->base + TxCmd); |
1284 | return 1; | 1284 | return 1; |
1285 | } | 1285 | } |
1286 | 1286 | ||
1287 | /* Caution: the write order is important here, set the field | 1287 | /* Caution: the write order is important here, set the field |
1288 | with the "ownership" bits last. */ | 1288 | with the "ownership" bits last. */ |
@@ -1322,15 +1322,15 @@ static int hamachi_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1322 | } | 1322 | } |
1323 | #endif | 1323 | #endif |
1324 | 1324 | ||
1325 | hmp->tx_ring[entry].addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, | 1325 | hmp->tx_ring[entry].addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, |
1326 | skb->data, skb->len, PCI_DMA_TODEVICE)); | 1326 | skb->data, skb->len, PCI_DMA_TODEVICE)); |
1327 | 1327 | ||
1328 | /* Hmmmm, could probably put a DescIntr on these, but the way | 1328 | /* Hmmmm, could probably put a DescIntr on these, but the way |
1329 | the driver is currently coded makes Tx interrupts unnecessary | 1329 | the driver is currently coded makes Tx interrupts unnecessary |
1330 | since the clearing of the Tx ring is handled by the start_xmit | 1330 | since the clearing of the Tx ring is handled by the start_xmit |
1331 | routine. This organization helps mitigate the interrupts a | 1331 | routine. This organization helps mitigate the interrupts a |
1332 | bit and probably renders the max_tx_latency param useless. | 1332 | bit and probably renders the max_tx_latency param useless. |
1333 | 1333 | ||
1334 | Update: Putting a DescIntr bit on all of the descriptors and | 1334 | Update: Putting a DescIntr bit on all of the descriptors and |
1335 | mitigating interrupt frequency with the tx_min_pkt parameter. -KDU | 1335 | mitigating interrupt frequency with the tx_min_pkt parameter. -KDU |
1336 | */ | 1336 | */ |
@@ -1359,7 +1359,7 @@ static int hamachi_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1359 | * hence, any packet that got put off because we were in the transmit | 1359 | * hence, any packet that got put off because we were in the transmit |
1360 | * routine should IMMEDIATELY get a chance to be re-queued. -KDU | 1360 | * routine should IMMEDIATELY get a chance to be re-queued. -KDU |
1361 | */ | 1361 | */ |
1362 | if ((hmp->cur_tx - hmp->dirty_tx) < (TX_RING_SIZE - 4)) | 1362 | if ((hmp->cur_tx - hmp->dirty_tx) < (TX_RING_SIZE - 4)) |
1363 | netif_wake_queue(dev); /* Typical path */ | 1363 | netif_wake_queue(dev); /* Typical path */ |
1364 | else { | 1364 | else { |
1365 | hmp->tx_full = 1; | 1365 | hmp->tx_full = 1; |
@@ -1412,27 +1412,27 @@ static irqreturn_t hamachi_interrupt(int irq, void *dev_instance, struct pt_regs | |||
1412 | /* This code should RARELY need to execute. After all, this is | 1412 | /* This code should RARELY need to execute. After all, this is |
1413 | * a gigabit link, it should consume packets as fast as we put | 1413 | * a gigabit link, it should consume packets as fast as we put |
1414 | * them in AND we clear the Tx ring in hamachi_start_xmit(). | 1414 | * them in AND we clear the Tx ring in hamachi_start_xmit(). |
1415 | */ | 1415 | */ |
1416 | if (hmp->tx_full){ | 1416 | if (hmp->tx_full){ |
1417 | for (; hmp->cur_tx - hmp->dirty_tx > 0; hmp->dirty_tx++){ | 1417 | for (; hmp->cur_tx - hmp->dirty_tx > 0; hmp->dirty_tx++){ |
1418 | int entry = hmp->dirty_tx % TX_RING_SIZE; | 1418 | int entry = hmp->dirty_tx % TX_RING_SIZE; |
1419 | struct sk_buff *skb; | 1419 | struct sk_buff *skb; |
1420 | 1420 | ||
1421 | if (hmp->tx_ring[entry].status_n_length & cpu_to_le32(DescOwn)) | 1421 | if (hmp->tx_ring[entry].status_n_length & cpu_to_le32(DescOwn)) |
1422 | break; | 1422 | break; |
1423 | skb = hmp->tx_skbuff[entry]; | 1423 | skb = hmp->tx_skbuff[entry]; |
1424 | /* Free the original skb. */ | 1424 | /* Free the original skb. */ |
1425 | if (skb){ | 1425 | if (skb){ |
1426 | pci_unmap_single(hmp->pci_dev, | 1426 | pci_unmap_single(hmp->pci_dev, |
1427 | hmp->tx_ring[entry].addr, | 1427 | hmp->tx_ring[entry].addr, |
1428 | skb->len, | 1428 | skb->len, |
1429 | PCI_DMA_TODEVICE); | 1429 | PCI_DMA_TODEVICE); |
1430 | dev_kfree_skb_irq(skb); | 1430 | dev_kfree_skb_irq(skb); |
1431 | hmp->tx_skbuff[entry] = NULL; | 1431 | hmp->tx_skbuff[entry] = NULL; |
1432 | } | 1432 | } |
1433 | hmp->tx_ring[entry].status_n_length = 0; | 1433 | hmp->tx_ring[entry].status_n_length = 0; |
1434 | if (entry >= TX_RING_SIZE-1) | 1434 | if (entry >= TX_RING_SIZE-1) |
1435 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= | 1435 | hmp->tx_ring[TX_RING_SIZE-1].status_n_length |= |
1436 | cpu_to_le32(DescEndRing); | 1436 | cpu_to_le32(DescEndRing); |
1437 | hmp->stats.tx_packets++; | 1437 | hmp->stats.tx_packets++; |
1438 | } | 1438 | } |
@@ -1498,9 +1498,9 @@ static int hamachi_rx(struct net_device *dev) | |||
1498 | struct hamachi_desc *desc = &(hmp->rx_ring[entry]); | 1498 | struct hamachi_desc *desc = &(hmp->rx_ring[entry]); |
1499 | u32 desc_status = le32_to_cpu(desc->status_n_length); | 1499 | u32 desc_status = le32_to_cpu(desc->status_n_length); |
1500 | u16 data_size = desc_status; /* Implicit truncate */ | 1500 | u16 data_size = desc_status; /* Implicit truncate */ |
1501 | u8 *buf_addr; | 1501 | u8 *buf_addr; |
1502 | s32 frame_status; | 1502 | s32 frame_status; |
1503 | 1503 | ||
1504 | if (desc_status & DescOwn) | 1504 | if (desc_status & DescOwn) |
1505 | break; | 1505 | break; |
1506 | pci_dma_sync_single_for_cpu(hmp->pci_dev, | 1506 | pci_dma_sync_single_for_cpu(hmp->pci_dev, |
@@ -1540,7 +1540,7 @@ static int hamachi_rx(struct net_device *dev) | |||
1540 | } else { | 1540 | } else { |
1541 | struct sk_buff *skb; | 1541 | struct sk_buff *skb; |
1542 | /* Omit CRC */ | 1542 | /* Omit CRC */ |
1543 | u16 pkt_len = (frame_status & 0x07ff) - 4; | 1543 | u16 pkt_len = (frame_status & 0x07ff) - 4; |
1544 | #ifdef RX_CHECKSUM | 1544 | #ifdef RX_CHECKSUM |
1545 | u32 pfck = *(u32 *) &buf_addr[data_size - 8]; | 1545 | u32 pfck = *(u32 *) &buf_addr[data_size - 8]; |
1546 | #endif | 1546 | #endif |
@@ -1576,7 +1576,7 @@ static int hamachi_rx(struct net_device *dev) | |||
1576 | PCI_DMA_FROMDEVICE); | 1576 | PCI_DMA_FROMDEVICE); |
1577 | /* Call copy + cksum if available. */ | 1577 | /* Call copy + cksum if available. */ |
1578 | #if 1 || USE_IP_COPYSUM | 1578 | #if 1 || USE_IP_COPYSUM |
1579 | eth_copy_and_sum(skb, | 1579 | eth_copy_and_sum(skb, |
1580 | hmp->rx_skbuff[entry]->data, pkt_len, 0); | 1580 | hmp->rx_skbuff[entry]->data, pkt_len, 0); |
1581 | skb_put(skb, pkt_len); | 1581 | skb_put(skb, pkt_len); |
1582 | #else | 1582 | #else |
@@ -1588,7 +1588,7 @@ static int hamachi_rx(struct net_device *dev) | |||
1588 | hmp->rx_buf_sz, | 1588 | hmp->rx_buf_sz, |
1589 | PCI_DMA_FROMDEVICE); | 1589 | PCI_DMA_FROMDEVICE); |
1590 | } else { | 1590 | } else { |
1591 | pci_unmap_single(hmp->pci_dev, | 1591 | pci_unmap_single(hmp->pci_dev, |
1592 | hmp->rx_ring[entry].addr, | 1592 | hmp->rx_ring[entry].addr, |
1593 | hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); | 1593 | hmp->rx_buf_sz, PCI_DMA_FROMDEVICE); |
1594 | skb_put(skb = hmp->rx_skbuff[entry], pkt_len); | 1594 | skb_put(skb = hmp->rx_skbuff[entry], pkt_len); |
@@ -1619,18 +1619,18 @@ static int hamachi_rx(struct net_device *dev) | |||
1619 | p_r = *p; | 1619 | p_r = *p; |
1620 | p_r1 = *(p-1); | 1620 | p_r1 = *(p-1); |
1621 | switch (inv) { | 1621 | switch (inv) { |
1622 | case 0: | 1622 | case 0: |
1623 | crc = (p_r & 0xffff) + (p_r >> 16); | 1623 | crc = (p_r & 0xffff) + (p_r >> 16); |
1624 | break; | 1624 | break; |
1625 | case 1: | 1625 | case 1: |
1626 | crc = (p_r >> 16) + (p_r & 0xffff) | 1626 | crc = (p_r >> 16) + (p_r & 0xffff) |
1627 | + (p_r1 >> 16 & 0xff00); | 1627 | + (p_r1 >> 16 & 0xff00); |
1628 | break; | 1628 | break; |
1629 | case 2: | 1629 | case 2: |
1630 | crc = p_r + (p_r1 >> 16); | 1630 | crc = p_r + (p_r1 >> 16); |
1631 | break; | 1631 | break; |
1632 | case 3: | 1632 | case 3: |
1633 | crc = p_r + (p_r1 & 0xff00) + (p_r1 >> 16); | 1633 | crc = p_r + (p_r1 & 0xff00) + (p_r1 >> 16); |
1634 | break; | 1634 | break; |
1635 | default: /*NOTREACHED*/ crc = 0; | 1635 | default: /*NOTREACHED*/ crc = 0; |
1636 | } | 1636 | } |
@@ -1650,7 +1650,7 @@ static int hamachi_rx(struct net_device *dev) | |||
1650 | */ | 1650 | */ |
1651 | skb->ip_summed = CHECKSUM_COMPLETE; | 1651 | skb->ip_summed = CHECKSUM_COMPLETE; |
1652 | } | 1652 | } |
1653 | } | 1653 | } |
1654 | } | 1654 | } |
1655 | #endif /* RX_CHECKSUM */ | 1655 | #endif /* RX_CHECKSUM */ |
1656 | 1656 | ||
@@ -1675,15 +1675,15 @@ static int hamachi_rx(struct net_device *dev) | |||
1675 | break; /* Better luck next round. */ | 1675 | break; /* Better luck next round. */ |
1676 | skb->dev = dev; /* Mark as being used by this device. */ | 1676 | skb->dev = dev; /* Mark as being used by this device. */ |
1677 | skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ | 1677 | skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ |
1678 | desc->addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, | 1678 | desc->addr = cpu_to_leXX(pci_map_single(hmp->pci_dev, |
1679 | skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE)); | 1679 | skb->data, hmp->rx_buf_sz, PCI_DMA_FROMDEVICE)); |
1680 | } | 1680 | } |
1681 | desc->status_n_length = cpu_to_le32(hmp->rx_buf_sz); | 1681 | desc->status_n_length = cpu_to_le32(hmp->rx_buf_sz); |
1682 | if (entry >= RX_RING_SIZE-1) | 1682 | if (entry >= RX_RING_SIZE-1) |
1683 | desc->status_n_length |= cpu_to_le32(DescOwn | | 1683 | desc->status_n_length |= cpu_to_le32(DescOwn | |
1684 | DescEndPacket | DescEndRing | DescIntr); | 1684 | DescEndPacket | DescEndRing | DescIntr); |
1685 | else | 1685 | else |
1686 | desc->status_n_length |= cpu_to_le32(DescOwn | | 1686 | desc->status_n_length |= cpu_to_le32(DescOwn | |
1687 | DescEndPacket | DescIntr); | 1687 | DescEndPacket | DescIntr); |
1688 | } | 1688 | } |
1689 | 1689 | ||
@@ -1794,8 +1794,8 @@ static int hamachi_close(struct net_device *dev) | |||
1794 | hmp->rx_ring[i].status_n_length = 0; | 1794 | hmp->rx_ring[i].status_n_length = 0; |
1795 | hmp->rx_ring[i].addr = 0xBADF00D0; /* An invalid address. */ | 1795 | hmp->rx_ring[i].addr = 0xBADF00D0; /* An invalid address. */ |
1796 | if (skb) { | 1796 | if (skb) { |
1797 | pci_unmap_single(hmp->pci_dev, | 1797 | pci_unmap_single(hmp->pci_dev, |
1798 | hmp->rx_ring[i].addr, hmp->rx_buf_sz, | 1798 | hmp->rx_ring[i].addr, hmp->rx_buf_sz, |
1799 | PCI_DMA_FROMDEVICE); | 1799 | PCI_DMA_FROMDEVICE); |
1800 | dev_kfree_skb(skb); | 1800 | dev_kfree_skb(skb); |
1801 | hmp->rx_skbuff[i] = NULL; | 1801 | hmp->rx_skbuff[i] = NULL; |
@@ -1804,8 +1804,8 @@ static int hamachi_close(struct net_device *dev) | |||
1804 | for (i = 0; i < TX_RING_SIZE; i++) { | 1804 | for (i = 0; i < TX_RING_SIZE; i++) { |
1805 | skb = hmp->tx_skbuff[i]; | 1805 | skb = hmp->tx_skbuff[i]; |
1806 | if (skb) { | 1806 | if (skb) { |
1807 | pci_unmap_single(hmp->pci_dev, | 1807 | pci_unmap_single(hmp->pci_dev, |
1808 | hmp->tx_ring[i].addr, skb->len, | 1808 | hmp->tx_ring[i].addr, skb->len, |
1809 | PCI_DMA_TODEVICE); | 1809 | PCI_DMA_TODEVICE); |
1810 | dev_kfree_skb(skb); | 1810 | dev_kfree_skb(skb); |
1811 | hmp->tx_skbuff[i] = NULL; | 1811 | hmp->tx_skbuff[i] = NULL; |
@@ -1829,7 +1829,7 @@ static struct net_device_stats *hamachi_get_stats(struct net_device *dev) | |||
1829 | according to ifconfig. It does get incremented in hamachi_tx(), | 1829 | according to ifconfig. It does get incremented in hamachi_tx(), |
1830 | so I think I'll comment it out here and see if better things | 1830 | so I think I'll comment it out here and see if better things |
1831 | happen. | 1831 | happen. |
1832 | */ | 1832 | */ |
1833 | /* hmp->stats.tx_packets = readl(ioaddr + 0x000); */ | 1833 | /* hmp->stats.tx_packets = readl(ioaddr + 0x000); */ |
1834 | 1834 | ||
1835 | hmp->stats.rx_bytes = readl(ioaddr + 0x330); /* Total Uni+Brd+Multi */ | 1835 | hmp->stats.rx_bytes = readl(ioaddr + 0x330); /* Total Uni+Brd+Multi */ |
@@ -1851,8 +1851,6 @@ static void set_rx_mode(struct net_device *dev) | |||
1851 | void __iomem *ioaddr = hmp->base; | 1851 | void __iomem *ioaddr = hmp->base; |
1852 | 1852 | ||
1853 | if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ | 1853 | if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ |
1854 | /* Unconditionally log net taps. */ | ||
1855 | printk(KERN_NOTICE "%s: Promiscuous mode enabled.\n", dev->name); | ||
1856 | writew(0x000F, ioaddr + AddrMode); | 1854 | writew(0x000F, ioaddr + AddrMode); |
1857 | } else if ((dev->mc_count > 63) || (dev->flags & IFF_ALLMULTI)) { | 1855 | } else if ((dev->mc_count > 63) || (dev->flags & IFF_ALLMULTI)) { |
1858 | /* Too many to match, or accept all multicasts. */ | 1856 | /* Too many to match, or accept all multicasts. */ |
@@ -1921,7 +1919,7 @@ static u32 hamachi_get_link(struct net_device *dev) | |||
1921 | return mii_link_ok(&np->mii_if); | 1919 | return mii_link_ok(&np->mii_if); |
1922 | } | 1920 | } |
1923 | 1921 | ||
1924 | static struct ethtool_ops ethtool_ops = { | 1922 | static const struct ethtool_ops ethtool_ops = { |
1925 | .begin = check_if_running, | 1923 | .begin = check_if_running, |
1926 | .get_drvinfo = hamachi_get_drvinfo, | 1924 | .get_drvinfo = hamachi_get_drvinfo, |
1927 | .get_settings = hamachi_get_settings, | 1925 | .get_settings = hamachi_get_settings, |
@@ -1930,7 +1928,7 @@ static struct ethtool_ops ethtool_ops = { | |||
1930 | .get_link = hamachi_get_link, | 1928 | .get_link = hamachi_get_link, |
1931 | }; | 1929 | }; |
1932 | 1930 | ||
1933 | static struct ethtool_ops ethtool_ops_no_mii = { | 1931 | static const struct ethtool_ops ethtool_ops_no_mii = { |
1934 | .begin = check_if_running, | 1932 | .begin = check_if_running, |
1935 | .get_drvinfo = hamachi_get_drvinfo, | 1933 | .get_drvinfo = hamachi_get_drvinfo, |
1936 | }; | 1934 | }; |
@@ -1978,9 +1976,9 @@ static void __devexit hamachi_remove_one (struct pci_dev *pdev) | |||
1978 | if (dev) { | 1976 | if (dev) { |
1979 | struct hamachi_private *hmp = netdev_priv(dev); | 1977 | struct hamachi_private *hmp = netdev_priv(dev); |
1980 | 1978 | ||
1981 | pci_free_consistent(pdev, RX_TOTAL_SIZE, hmp->rx_ring, | 1979 | pci_free_consistent(pdev, RX_TOTAL_SIZE, hmp->rx_ring, |
1982 | hmp->rx_ring_dma); | 1980 | hmp->rx_ring_dma); |
1983 | pci_free_consistent(pdev, TX_TOTAL_SIZE, hmp->tx_ring, | 1981 | pci_free_consistent(pdev, TX_TOTAL_SIZE, hmp->tx_ring, |
1984 | hmp->tx_ring_dma); | 1982 | hmp->tx_ring_dma); |
1985 | unregister_netdev(dev); | 1983 | unregister_netdev(dev); |
1986 | iounmap(hmp->base); | 1984 | iounmap(hmp->base); |