diff options
Diffstat (limited to 'drivers/net/wireless/orinoco/main.c')
| -rw-r--r-- | drivers/net/wireless/orinoco/main.c | 91 | 
1 files changed, 47 insertions, 44 deletions
diff --git a/drivers/net/wireless/orinoco/main.c b/drivers/net/wireless/orinoco/main.c index e8e2d0f4763..38ec8d19ac2 100644 --- a/drivers/net/wireless/orinoco/main.c +++ b/drivers/net/wireless/orinoco/main.c @@ -4,7 +4,7 @@   * adaptors, with Lucent/Agere, Intersil or Symbol firmware.   *   * Current maintainers (as of 29 September 2003) are: - * 	Pavel Roskin <proski AT gnu.org> + *	Pavel Roskin <proski AT gnu.org>   * and	David Gibson <hermes AT gibson.dropbear.id.au>   *   * (C) Copyright David Gibson, IBM Corporation 2001-2003. @@ -121,7 +121,7 @@ module_param(orinoco_debug, int, 0644);  MODULE_PARM_DESC(orinoco_debug, "Debug level");  #endif -static int suppress_linkstatus; /* = 0 */ +static bool suppress_linkstatus; /* = 0 */  module_param(suppress_linkstatus, bool, 0644);  MODULE_PARM_DESC(suppress_linkstatus, "Don't log link status changes"); @@ -146,10 +146,10 @@ static const u8 encaps_hdr[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};  #define ORINOCO_MAX_MTU		(IEEE80211_MAX_DATA_LEN - ENCAPS_OVERHEAD)  #define MAX_IRQLOOPS_PER_IRQ	10 -#define MAX_IRQLOOPS_PER_JIFFY	(20000/HZ) /* Based on a guestimate of -					    * how many events the -					    * device could -					    * legitimately generate */ +#define MAX_IRQLOOPS_PER_JIFFY	(20000 / HZ)	/* Based on a guestimate of +						 * how many events the +						 * device could +						 * legitimately generate */  #define DUMMY_FID		0xFFFF @@ -157,7 +157,7 @@ static const u8 encaps_hdr[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00};    HERMES_MAX_MULTICAST : 0)*/  #define MAX_MULTICAST(priv)	(HERMES_MAX_MULTICAST) -#define ORINOCO_INTEN	 	(HERMES_EV_RX | HERMES_EV_ALLOC \ +#define ORINOCO_INTEN		(HERMES_EV_RX | HERMES_EV_ALLOC \  				 | HERMES_EV_TX | HERMES_EV_TXEXC \  				 | HERMES_EV_WTERR | HERMES_EV_INFO \  				 | HERMES_EV_INFDROP) @@ -437,12 +437,12 @@ static netdev_tx_t orinoco_xmit(struct sk_buff *skb, struct net_device *dev)  {  	struct orinoco_private *priv = ndev_priv(dev);  	struct net_device_stats *stats = &priv->stats; -	hermes_t *hw = &priv->hw; +	struct hermes *hw = &priv->hw;  	int err = 0;  	u16 txfid = priv->txfid;  	int tx_control;  	unsigned long flags; -	u8 mic_buf[MICHAEL_MIC_LEN+1]; +	u8 mic_buf[MICHAEL_MIC_LEN + 1];  	if (!netif_running(dev)) {  		printk(KERN_ERR "%s: Tx on stopped device!\n", @@ -579,7 +579,7 @@ static netdev_tx_t orinoco_xmit(struct sk_buff *skb, struct net_device *dev)  	return NETDEV_TX_BUSY;  } -static void __orinoco_ev_alloc(struct net_device *dev, hermes_t *hw) +static void __orinoco_ev_alloc(struct net_device *dev, struct hermes *hw)  {  	struct orinoco_private *priv = ndev_priv(dev);  	u16 fid = hermes_read_regn(hw, ALLOCFID); @@ -594,7 +594,7 @@ static void __orinoco_ev_alloc(struct net_device *dev, hermes_t *hw)  	hermes_write_regn(hw, ALLOCFID, DUMMY_FID);  } -static void __orinoco_ev_tx(struct net_device *dev, hermes_t *hw) +static void __orinoco_ev_tx(struct net_device *dev, struct hermes *hw)  {  	struct orinoco_private *priv = ndev_priv(dev);  	struct net_device_stats *stats = &priv->stats; @@ -606,7 +606,7 @@ static void __orinoco_ev_tx(struct net_device *dev, hermes_t *hw)  	hermes_write_regn(hw, TXCOMPLFID, DUMMY_FID);  } -static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw) +static void __orinoco_ev_txexc(struct net_device *dev, struct hermes *hw)  {  	struct orinoco_private *priv = ndev_priv(dev);  	struct net_device_stats *stats = &priv->stats; @@ -753,7 +753,7 @@ static void orinoco_rx_monitor(struct net_device *dev, u16 rxfid,  	struct sk_buff *skb;  	struct orinoco_private *priv = ndev_priv(dev);  	struct net_device_stats *stats = &priv->stats; -	hermes_t *hw = &priv->hw; +	struct hermes *hw = &priv->hw;  	len = le16_to_cpu(desc->data_len); @@ -840,7 +840,7 @@ static void orinoco_rx_monitor(struct net_device *dev, u16 rxfid,  	stats->rx_dropped++;  } -void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw) +void __orinoco_ev_rx(struct net_device *dev, struct hermes *hw)  {  	struct orinoco_private *priv = ndev_priv(dev);  	struct net_device_stats *stats = &priv->stats; @@ -853,12 +853,8 @@ void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)  	int err;  	desc = kmalloc(sizeof(*desc), GFP_ATOMIC); -	if (!desc) { -		printk(KERN_WARNING -		       "%s: Can't allocate space for RX descriptor\n", -		       dev->name); +	if (!desc)  		goto update_stats; -	}  	rxfid = hermes_read_regn(hw, RXFID); @@ -918,7 +914,7 @@ void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)  	   32bit boundary, plus 1 byte so we can read in odd length  	   packets from the card, which has an IO granularity of 16  	   bits */ -	skb = dev_alloc_skb(length+ETH_HLEN+2+1); +	skb = dev_alloc_skb(length + ETH_HLEN + 2 + 1);  	if (!skb) {  		printk(KERN_WARNING "%s: Can't allocate skb for Rx\n",  		       dev->name); @@ -941,11 +937,9 @@ void __orinoco_ev_rx(struct net_device *dev, hermes_t *hw)  	/* Add desc and skb to rx queue */  	rx_data = kzalloc(sizeof(*rx_data), GFP_ATOMIC); -	if (!rx_data) { -		printk(KERN_WARNING "%s: Can't allocate RX packet\n", -			dev->name); +	if (!rx_data)  		goto drop; -	} +  	rx_data->desc = desc;  	rx_data->skb = skb;  	list_add_tail(&rx_data->list, &priv->rx_list); @@ -1338,6 +1332,9 @@ static void qbuf_scan(struct orinoco_private *priv, void *buf,  	unsigned long flags;  	sd = kmalloc(sizeof(*sd), GFP_ATOMIC); +	if (!sd) +		return; +  	sd->buf = buf;  	sd->len = len;  	sd->type = type; @@ -1355,6 +1352,9 @@ static void qabort_scan(struct orinoco_private *priv)  	unsigned long flags;  	sd = kmalloc(sizeof(*sd), GFP_ATOMIC); +	if (!sd) +		return; +  	sd->len = -1; /* Abort */  	spin_lock_irqsave(&priv->scan_lock, flags); @@ -1376,13 +1376,13 @@ static void orinoco_process_scan_results(struct work_struct *work)  	spin_lock_irqsave(&priv->scan_lock, flags);  	list_for_each_entry_safe(sd, temp, &priv->scan_list, list) { -		spin_unlock_irqrestore(&priv->scan_lock, flags);  		buf = sd->buf;  		len = sd->len;  		type = sd->type;  		list_del(&sd->list); +		spin_unlock_irqrestore(&priv->scan_lock, flags);  		kfree(sd);  		if (len > 0) { @@ -1392,10 +1392,9 @@ static void orinoco_process_scan_results(struct work_struct *work)  				orinoco_add_hostscan_results(priv, buf, len);  			kfree(buf); -		} else if (priv->scan_request) { +		} else {  			/* Either abort or complete the scan */ -			cfg80211_scan_done(priv->scan_request, (len < 0)); -			priv->scan_request = NULL; +			orinoco_scan_done(priv, (len < 0));  		}  		spin_lock_irqsave(&priv->scan_lock, flags); @@ -1403,7 +1402,7 @@ static void orinoco_process_scan_results(struct work_struct *work)  	spin_unlock_irqrestore(&priv->scan_lock, flags);  } -void __orinoco_ev_info(struct net_device *dev, hermes_t *hw) +void __orinoco_ev_info(struct net_device *dev, struct hermes *hw)  {  	struct orinoco_private *priv = ndev_priv(dev);  	u16 infofid; @@ -1621,7 +1620,7 @@ void __orinoco_ev_info(struct net_device *dev, hermes_t *hw)  }  EXPORT_SYMBOL(__orinoco_ev_info); -static void __orinoco_ev_infdrop(struct net_device *dev, hermes_t *hw) +static void __orinoco_ev_infdrop(struct net_device *dev, struct hermes *hw)  {  	if (net_ratelimit())  		printk(KERN_DEBUG "%s: Information frame lost.\n", dev->name); @@ -1684,6 +1683,8 @@ static int __orinoco_down(struct orinoco_private *priv)  		hermes_write_regn(hw, EVACK, 0xffff);  	} +	orinoco_scan_done(priv, true); +  	/* firmware will have to reassociate */  	netif_carrier_off(dev);  	priv->last_linkstatus = 0xffff; @@ -1762,10 +1763,7 @@ void orinoco_reset(struct work_struct *work)  	orinoco_unlock(priv, &flags);  	/* Scanning support: Notify scan cancellation */ -	if (priv->scan_request) { -		cfg80211_scan_done(priv->scan_request, 1); -		priv->scan_request = NULL; -	} +	orinoco_scan_done(priv, true);  	if (priv->hard_reset) {  		err = (*priv->hard_reset)(priv); @@ -1813,6 +1811,12 @@ static int __orinoco_commit(struct orinoco_private *priv)  	struct net_device *dev = priv->ndev;  	int err = 0; +	/* If we've called commit, we are reconfiguring or bringing the +	 * interface up. Maintaining countermeasures across this would +	 * be confusing, so note that we've disabled them. The port will +	 * be enabled later in orinoco_commit or __orinoco_up. */ +	priv->tkip_cm_active = 0; +  	err = orinoco_hw_program_rids(priv);  	/* FIXME: what about netif_tx_lock */ @@ -1827,7 +1831,7 @@ static int __orinoco_commit(struct orinoco_private *priv)  int orinoco_commit(struct orinoco_private *priv)  {  	struct net_device *dev = priv->ndev; -	hermes_t *hw = &priv->hw; +	struct hermes *hw = &priv->hw;  	int err;  	if (priv->broken_disableport) { @@ -1870,12 +1874,12 @@ int orinoco_commit(struct orinoco_private *priv)  /* Interrupt handler                                                */  /********************************************************************/ -static void __orinoco_ev_tick(struct net_device *dev, hermes_t *hw) +static void __orinoco_ev_tick(struct net_device *dev, struct hermes *hw)  {  	printk(KERN_DEBUG "%s: TICK\n", dev->name);  } -static void __orinoco_ev_wterr(struct net_device *dev, hermes_t *hw) +static void __orinoco_ev_wterr(struct net_device *dev, struct hermes *hw)  {  	/* This seems to happen a fair bit under load, but ignoring it  	   seems to work fine...*/ @@ -1887,7 +1891,7 @@ irqreturn_t orinoco_interrupt(int irq, void *dev_id)  {  	struct orinoco_private *priv = dev_id;  	struct net_device *dev = priv->ndev; -	hermes_t *hw = &priv->hw; +	struct hermes *hw = &priv->hw;  	int count = MAX_IRQLOOPS_PER_IRQ;  	u16 evstat, events;  	/* These are used to detect a runaway interrupt situation. @@ -1954,7 +1958,7 @@ irqreturn_t orinoco_interrupt(int irq, void *dev_id)  		evstat = hermes_read_regn(hw, EVSTAT);  		events = evstat & hw->inten; -	}; +	}  	orinoco_unlock(priv, &flags);  	return IRQ_HANDLED; @@ -2013,8 +2017,8 @@ static void orinoco_unregister_pm_notifier(struct orinoco_private *priv)  	unregister_pm_notifier(&priv->pm_notifier);  }  #else /* !PM_SLEEP || HERMES_CACHE_FW_ON_INIT */ -#define orinoco_register_pm_notifier(priv) do { } while(0) -#define orinoco_unregister_pm_notifier(priv) do { } while(0) +#define orinoco_register_pm_notifier(priv) do { } while (0) +#define orinoco_unregister_pm_notifier(priv) do { } while (0)  #endif  /********************************************************************/ @@ -2025,7 +2029,7 @@ int orinoco_init(struct orinoco_private *priv)  {  	struct device *dev = priv->dev;  	struct wiphy *wiphy = priv_to_wiphy(priv); -	hermes_t *hw = &priv->hw; +	struct hermes *hw = &priv->hw;  	int err = 0;  	/* No need to lock, the hw_unavailable flag is already set in @@ -2131,7 +2135,7 @@ static const struct net_device_ops orinoco_netdev_ops = {  	.ndo_open		= orinoco_open,  	.ndo_stop		= orinoco_stop,  	.ndo_start_xmit		= orinoco_xmit, -	.ndo_set_multicast_list	= orinoco_set_multicast_list, +	.ndo_set_rx_mode	= orinoco_set_multicast_list,  	.ndo_change_mtu		= orinoco_change_mtu,  	.ndo_set_mac_address	= eth_mac_addr,  	.ndo_validate_addr	= eth_validate_addr, @@ -2280,7 +2284,6 @@ int orinoco_if_add(struct orinoco_private *priv,  	netif_carrier_off(dev);  	memcpy(dev->dev_addr, wiphy->perm_addr, ETH_ALEN); -	memcpy(dev->perm_addr, wiphy->perm_addr, ETH_ALEN);  	dev->base_addr = base_addr;  	dev->irq = irq;  | 
