2.6.x net driver fixes
PATCH 1/1 2.6.x net driver fixes
Please pull from 'upstream-fixes' branch of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
to receive the following assorted fixes:
drivers/net/au1000_eth.c | 1 drivers/net/e100.c | 273 ++++++++++++++++++++++++++++++-- drivers/net/fec_8xx/Kconfig | 2 drivers/net/ioc3-eth.c | 2 drivers/net/r8169.c | 6 drivers/net/saa9730.h | 36 ++-- drivers/net/smc91x.c | 17 + drivers/net/wan/hdlc_cisco.c | 6 drivers/net/wan/hdlc_fr.c | 4 drivers/net/wan/hdlc_generic.c | 6 drivers/net/wireless/hermes.c | 6 drivers/net/wireless/hermes.h | 6 drivers/net/wireless/i82593.h | 11 - drivers/net/wireless/ipw2100.c | 29 ++- drivers/net/wireless/ipw2100.h | 2 drivers/net/wireless/prism54/isl_38xx.c | 4 include/net/ieee80211.h | 2 17 files changed, 352 insertions(+), 61 deletions(-)
Andrew Morton:
git-netdev-all-ieee80211_get_payload-warning-fix
Francois Romieu:
r8169: fix printk_ratelimit in the interrupt handler
r8169: do not abort when the power management capabilities are disabled
Gabriel A. Devenyi:
drivers/net/wireless/hermes.c unsigned int comparision
James Ketrenos:
ipw2100: Fix 'Driver using old /proc/net/wireless...' message
Jeff Garzik:
[wireless hermes] build fix
Jesse Brandeburg:
e100: re-enable microcode with more useful defaults
John W. Linville:
i82593.h: make header comment GPL-compatible
fec_8xx: make CONFIG_FEC_8XX depend on CONFIG_8xx
Krzysztof Halasa:
Generic HDLC WAN drivers - disable netif_carrier_off()
Nicolas Pitre:
smc91x: fix one source of spurious interrupts
Ralf Baechle:
IOC3: Replace obsolete PCI API
au1000_eth: Include <linux/config.h>
SAA9730: Add missing header bits.
Roger While:
prism54 : Remove extraneous udelay/register read
Russell King:
smc91x: fix bank mismatch
drivers/net/au1000_eth.c +1 -0
@@ -32,6 +32,7 @@* */ +#include <linux/config.h> #include <linux/module.h> #include <linux/kernel.h> #include <linux/sched.h>
drivers/net/e100.c +256 -17
296 lines not on this page · raw message
drivers/net/fec_8xx/Kconfig +1 -1
@@ -1,6 +1,6 @@ config FEC_8XX tristate "Motorola 8xx FEC driver" - depends on NET_ETHERNET && FEC + depends on NET_ETHERNET && 8xx select MII config FEC_8XX_GENERIC_PHY
drivers/net/ioc3-eth.c +1 -1
@@ -1360,7 +1360,7 @@ static struct pci_driver ioc3_driver = {static int __init ioc3_init_module (void ) { -return pci_module_init (&ioc3_driver); +return pci_register_driver (&ioc3_driver); } static void __exit ioc3_cleanup_module(void)
drivers/net/r8169.c +2 -4
@@ -1346,10 +1346,8 @@ rtl8169_init_board(struct pci_dev *pdev, }else {if (netif_msg_probe (tp)) { printk(KERN_ERR PFX -"Cannot find PowerManagement capability. " - "Aborting.\n"); + "PowerManagement capability not found.\n"); } - goto err_out_mwi; }/* make sure PCI base addr 1 is MMIO */
@@ -2516,7 +2514,7 @@ rtl8169_interrupt(int irq, void *dev_ins }while (boguscnt >0 );if (boguscnt <=0 ) { -if (net_ratelimit () &&netif_msg_intr (tp)) { +if (netif_msg_intr (tp) &&net_ratelimit () ) {printk (KERN_WARNING "%s: Too much work at interrupt!\n" , dev->name); }
drivers/net/saa9730.h +25 -11
@@ -1,6 +1,7 @@/* -* Carsten Langgaard, [email protected] -* Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. +* Copyright (C) 2000, 2005 MIPS Technologies, Inc. All rights reserved. +* Authors: Carsten Langgaard <[email protected]> +* Maciej W. Rozycki <[email protected]> * * ######################################################################## *
@@ -265,6 +266,7 @@/* The SAA9730 (LAN) controller register map, as seen via the PCI-bus. */ #define SAA9730_LAN_REGS_ADDR 0x20400 +#define SAA9730_LAN_REGS_SIZE 0x00400struct lan_saa9730_regmap {volatile unsigned int TxBuffA;/* 0x20400 */
@@ -309,6 +311,7 @@ typedef volatile struct lan_saa9730_regm/* The SAA9730 (EVM) controller register map, as seen via the PCI-bus. */ #define SAA9730_EVM_REGS_ADDR 0x02000 +#define SAA9730_EVM_REGS_SIZE 0x00400struct evm_saa9730_regmap {volatile unsigned int InterruptStatus1;/* 0x2000 */
@@ -329,16 +332,32 @@ typedef volatile struct evm_saa9730_regmstruct lan_saa9730_private { +/* +* Rx/Tx packet buffers. +* The Rx and Tx packets must be PACKET_SIZE aligned. +*/ +void *buffer_start; +unsigned int buffer_size; + +/* +* DMA address of beginning of this object, returned +* by pci_alloc_consistent(). +*/ +dma_addr_t dma_addr; + +/* Pointer to the associated pci device structure */ +struct pci_dev *pci_dev; +/* Pointer for the SAA9730 LAN controller register set. */ t_lan_saa9730_regmap *lan_saa9730_regs;/* Pointer to the SAA9730 EVM register. */ t_evm_saa9730_regmap *evm_saa9730_regs; -/* TRUE if the next buffer to write is RxBuffA, FALSE if RxBuffB. */ -unsigned char NextRcvToUseIsA;/* Rcv buffer Index. */ unsigned char NextRcvPacketIndex; +/* Next buffer index. */ +unsigned char NextRcvBufferIndex;/* Index of next packet to use in that buffer. */ unsigned char NextTxmPacketIndex;
@@ -353,13 +372,8 @@ struct lan_saa9730_private {unsigned char DmaRcvPackets;unsigned char DmaTxmPackets; -unsigned char RcvAIndex;/* index into RcvBufferSpace[] for Blk A */ -unsigned char RcvBIndex;/* index into RcvBufferSpace[] for Blk B */ - -unsigned int - TxmBuffer[LAN_SAA9730_BUFFERS ][LAN_SAA9730_TXM_Q_SIZE ]; -unsigned int - RcvBuffer[LAN_SAA9730_BUFFERS ][LAN_SAA9730_RCV_Q_SIZE ]; +void *TxmBuffer[LAN_SAA9730_BUFFERS ][LAN_SAA9730_TXM_Q_SIZE ]; +void *RcvBuffer[LAN_SAA9730_BUFFERS ][LAN_SAA9730_RCV_Q_SIZE ];unsigned int TxBufferFree[LAN_SAA9730_BUFFERS ];unsigned char PhysicalAddress[LAN_SAA9730_CAM_ENTRIES ][6 ];
drivers/net/smc91x.c +13 -4
@@ -155,6 +155,12 @@ MODULE_LICENSE("GPL");#define MEMORY_WAIT_TIME 16/* +* The maximum number of processing loops allowed for each call to the +* IRQ handler. +*/ +#define MAX_IRQ_LOOPS 8 + +/* * This selects whether TX packets are sent one by one to the SMC91x internal * memory and throttled until transmission completes. This may prevent * RX overruns a litle by keeping much of the memory free for RX packets
@@ -684,7 +690,6 @@ static void smc_hardware_send_pkt(unsign/* queue the packet for TX */ SMC_SET_MMU_CMD (MC_ENQUEUE ); -SMC_ACK_INT (IM_TX_EMPTY_INT );smc_special_unlock (&lp->lock); dev->trans_start = jiffies;
@@ -1207,6 +1212,7 @@ static void smc_phy_configure(void *datasmc_phy_check_media (dev,1 ); smc_phy_configure_exit: +SMC_SELECT_BANK (2 );spin_unlock_irq (&lp->lock); lp->work_pending =0 ; }
@@ -1305,7 +1311,7 @@ static irqreturn_t smc_interrupt(int irqSMC_SET_INT_MASK (0 );/* set a timeout value, so I don't stay here forever */ - timeout =8 ; + timeout =MAX_IRQ_LOOPS ; do { status = SMC_GET_INT();
@@ -1372,10 +1378,13 @@ static irqreturn_t smc_interrupt(int irq/* restore register states */ SMC_SET_PTR (saved_pointer);SMC_SET_INT_MASK (mask); -spin_unlock (&lp->lock); -DBG (3 ,"%s: Interrupt done (%d loops)\n" , dev->name,8 -timeout); +if (timeout ==MAX_IRQ_LOOPS ) +PRINTK ("%s: spurious interrupt (mask = 0x%02x)\n" , + dev->name, mask); +DBG (3 ,"%s: Interrupt done (%d loops)\n" , + dev->name,MAX_IRQ_LOOPS - timeout);/* * We return IRQ_HANDLED unconditionally here even if there was
drivers/net/wan/hdlc_cisco.c +6 -0
@@ -192,7 +192,9 @@ static int cisco_rx(struct sk_buff *skb)"uptime %ud%uh%um%us)\n" , dev->name, days, hrs, min, sec); +#if 0 netif_carrier_on (dev); +#endif hdlc->state.cisco.up =1 ; } }
@@ -225,7 +227,9 @@ static void cisco_timer(unsigned long ar hdlc->state.cisco.settings.timeout * HZ)) { hdlc->state.cisco.up =0 ;printk (KERN_INFO "%s: Link down\n" , dev->name); +#if 0 netif_carrier_off (dev); +#endif } cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ,
@@ -261,8 +265,10 @@ static void cisco_stop(struct net_device {hdlc_device *hdlc =dev_to_hdlc (dev);del_timer_sync (&hdlc->state.cisco.timer); +#if 0 if (netif_carrier_ok (dev))netif_carrier_off (dev); +#endif hdlc->state.cisco.up =0 ; hdlc->state.cisco.request_sent =0 ; }
drivers/net/wan/hdlc_fr.c +4 -0
@@ -545,8 +545,10 @@ static void fr_set_link_state(int reliab hdlc->state.fr.reliable = reliable;if (reliable) { +#if 0 if (!netif_carrier_ok (dev))netif_carrier_on (dev); +#endif hdlc->state.fr.n391cnt =0 ;/* Request full status */ hdlc->state.fr.dce_changed =1 ;
@@ -560,8 +562,10 @@ static void fr_set_link_state(int reliab } } }else { +#if 0 if (netif_carrier_ok (dev))netif_carrier_off (dev); +#endif while (pvc) {/* Deactivate all PVCs */ pvc_carrier (0 , pvc);
drivers/net/wan/hdlc_generic.c +6 -0
@@ -79,11 +79,13 @@ static void __hdlc_set_carrier_on(structhdlc_device *hdlc =dev_to_hdlc (dev);if (hdlc->proto.start)return hdlc->proto.start (dev); +#if 0 #ifdef DEBUG_LINK if (netif_carrier_ok (dev))printk (KERN_ERR "hdlc_set_carrier_on(): already on\n" );#endif netif_carrier_on (dev); +#endif }
@@ -94,11 +96,13 @@ static void __hdlc_set_carrier_off(strucif (hdlc->proto.stop)return hdlc->proto.stop (dev); +#if 0 #ifdef DEBUG_LINK if (!netif_carrier_ok (dev))printk (KERN_ERR "hdlc_set_carrier_off(): already off\n" );#endif netif_carrier_off (dev); +#endif }
@@ -294,8 +298,10 @@ int register_hdlc_device(struct net_deviif (result !=0 )return -EIO ; +#if 0 if (netif_carrier_ok (dev))netif_carrier_off (dev);/* no carrier until DCD goes up */ +#endif return 0 ; }
drivers/net/wireless/hermes.c +3 -3
@@ -398,7 +398,7 @@ static int hermes_bap_seek(hermes_t *hw,* * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware */ -int hermes_bap_pread (hermes_t *hw,int bap,void *buf,unsigned len, +int hermes_bap_pread (hermes_t *hw,int bap,void *buf,int len,u16 id,u16 offset) {int dreg = bap ?HERMES_DATA1 :HERMES_DATA0 ;
@@ -424,7 +424,7 @@ int hermes_bap_pread(hermes_t *hw, int b* * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware */ -int hermes_bap_pwrite (hermes_t *hw,int bap,const void *buf,unsigned len, +int hermes_bap_pwrite (hermes_t *hw,int bap,const void *buf,int len,u16 id,u16 offset) {int dreg = bap ?HERMES_DATA1 :HERMES_DATA0 ;
@@ -450,7 +450,7 @@ int hermes_bap_pwrite(hermes_t *hw, int* * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware */ -int hermes_bap_pwrite_pad (hermes_t *hw,int bap,const void *buf,unsigned data_len,unsigned len, +int hermes_bap_pwrite_pad (hermes_t *hw,int bap,const void *buf,unsigned data_len,int len,u16 id,u16 offset) {int dreg = bap ?HERMES_DATA1 :HERMES_DATA0 ;
drivers/net/wireless/hermes.h +3 -3
@@ -372,12 +372,12 @@ int hermes_docmd_wait(hermes_t *hw, u16 struct hermes_response *resp);int hermes_allocate (hermes_t *hw,u16 size,u16 *fid); -int hermes_bap_pread (hermes_t *hw,int bap,void *buf,unsigned len, +int hermes_bap_pread (hermes_t *hw,int bap,void *buf,int len,u16 id,u16 offset); -int hermes_bap_pwrite (hermes_t *hw,int bap,const void *buf,unsigned len, +int hermes_bap_pwrite (hermes_t *hw,int bap,const void *buf,int len,u16 id,u16 offset);int hermes_bap_pwrite_pad (hermes_t *hw,int bap,const void *buf, -unsigned data_len,unsigned len,u16 id,u16 offset); +unsigned data_len,int len,u16 id,u16 offset);int hermes_read_ltv (hermes_t *hw,int bap,u16 rid,unsigned buflen,u16 *length,void *buf); int hermes_write_ltv(hermes_t *hw, int bap, u16 rid,
drivers/net/wireless/i82593.h +8 -3
@@ -7,11 +7,16 @@* * Copyright 1994, Anders Klemets <[email protected]> * -* This software may be freely distributed for noncommercial purposes -* as long as this notice is retained. -* * HISTORY * i82593.h,v +* Revision 1.4 2005/11/4 09:15:00 baroniunas +* Modified copyright with permission of author as follows: +* +* "If I82539.H is the only file with my copyright statement +* that is included in the Source Forge project, then you have +* my approval to change the copyright statement to be a GPL +* license, in the way you proposed on October 10." +* * Revision 1.1 1996/07/17 15:23:12 root * Initial revision *
drivers/net/wireless/ipw2100.c +18 -11
@@ -6344,7 +6344,8 @@ static struct net_device *ipw2100_alloc_ dev->ethtool_ops = &ipw2100_ethtool_ops; dev->tx_timeout = ipw2100_tx_timeout; dev->wireless_handlers = &ipw2100_wx_handler_def; - dev->get_wireless_stats = ipw2100_wx_wireless_stats; + priv->wireless_data.ieee80211 = priv->ieee; + dev->wireless_data = &priv->wireless_data; dev->set_mac_address = ipw2100_set_address; dev->watchdog_timeo =3 *HZ ; dev->irq =0 ;
@@ -7178,6 +7179,11 @@ static int ipw2100_wx_get_range(struct n } range->num_frequency = val; +/* Event capability (kernel + driver) */ + range->event_capa[0 ] = (IW_EVENT_CAPA_K_0 | +IW_EVENT_CAPA_MASK (SIOCGIWAP )); + range->event_capa[1 ] =IW_EVENT_CAPA_K_1 ; +IPW_DEBUG_WX ("GET Range\n" );return 0 ;
@@ -8446,16 +8452,6 @@ static iw_handler ipw2100_private_handle#endif /* CONFIG_IPW2100_MONITOR */ }; -static struct iw_handler_def ipw2100_wx_handler_def = { - .standard = ipw2100_wx_handlers, - .num_standard =sizeof (ipw2100_wx_handlers) /sizeof (iw_handler), - .num_private =sizeof (ipw2100_private_handler) /sizeof (iw_handler), - .num_private_args =sizeof (ipw2100_private_args) / -sizeof (struct iw_priv_args ), - .private = (iw_handler *) ipw2100_private_handler, - .private_args = (struct iw_priv_args *)ipw2100_private_args, -}; -/* * Get wireless statistics. * Called by /proc/net/wireless
@@ -8597,6 +8593,17 @@ static struct iw_statistics *ipw2100_wx_return (struct iw_statistics *)NULL ; } +static struct iw_handler_def ipw2100_wx_handler_def = { + .standard = ipw2100_wx_handlers, + .num_standard =sizeof (ipw2100_wx_handlers) /sizeof (iw_handler), + .num_private =sizeof (ipw2100_private_handler) /sizeof (iw_handler), + .num_private_args =sizeof (ipw2100_private_args) / +sizeof (struct iw_priv_args ), + .private = (iw_handler *) ipw2100_private_handler, + .private_args = (struct iw_priv_args *)ipw2100_private_args, + .get_wireless_stats = ipw2100_wx_wireless_stats, +}; +static void ipw2100_wx_event_work (struct ipw2100_priv *priv) {union iwreq_data wrqu;
drivers/net/wireless/ipw2100.h +2 -0
@@ -571,6 +571,8 @@ struct ipw2100_priv {struct net_device *net_dev;struct iw_statistics wstats; +struct iw_public_data wireless_data; +struct tasklet_struct irq_tasklet;struct workqueue_struct *workqueue;
drivers/net/wireless/prism54/isl_38xx.c +2 -2
@@ -164,12 +164,12 @@ isl38xx_trigger_device(int asleep, void/* assert the Wakeup interrupt in the Device Interrupt Register */ isl38xx_w32_flush (device_base,ISL38XX_DEV_INT_WAKEUP ,ISL38XX_DEV_INT_REG ); + +#if VERBOSE >SHOW_ERROR_MESSAGES udelay (ISL38XX_WRITEIO_DELAY );/* perform another read on the Device Status Register */ reg =readl (device_base +ISL38XX_CTRL_STAT_REG ); - -#if VERBOSE >SHOW_ERROR_MESSAGES do_gettimeofday (¤t_time);DEBUG (SHOW_TRACING ,"%08li.%08li Device register read %08x\n" , current_time.tv_sec, (long )current_time.tv_usec, reg);
include/net/ieee80211.h +1 -1
@@ -1042,7 +1042,7 @@ static inline u8 *ieee80211_get_payload(case IEEE80211_4ADDR_LEN :return ((struct ieee80211_hdr_4addr *)hdr)->payload; } - +return NULL ; }static inline int ieee80211_is_ofdm_rate (u8 rate)
Jeff Garzik <[email protected]> :
[...]
Quoted 5 lines
Andrew Morton:
git-netdev-all-ieee80211_get_payload-warning-fixFrancois Romieu:
r8169: fixprintk_ratelimitin the interrupt handler
Actually Andrew Morton should be credited for this one as the Signed-of-by lines suggests it. I messed the merge in my public tree.
Sorry for the inconvenience.
--
Ueimor