|
6022 /* Look into using netdev destructor to shutdown ieee80211? */ 6023 6024 static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, 6025 void __iomem * base_addr, 6026 unsigned long mem_start, 6027 unsigned long mem_len) 6028 { 6029 struct ipw2100_priv *priv; 6030 struct net_device *dev; 6031 6032 dev = alloc_ieee80211(sizeof(struct ipw2100_priv)); 6033 if (!dev) 6034 return NULL; 6035 priv = ieee80211_priv(dev); 6036 priv->ieee = netdev_priv(dev); 6037 priv->pci_dev = pci_dev; 6038 priv->net_dev = dev; 6039 6040 priv->ieee->hard_start_xmit = ipw2100_tx; 6041 priv->ieee->set_security = shim__set_security; 6042 6043 priv->ieee->perfect_rssi = -20; 6044 priv->ieee->worst_rssi = -85; 6045 3283 static irqreturn_t ipw2100_interrupt(int irq, void *data) 3284 { 3285 struct ipw2100_priv *priv = data; 3286 u32 inta, inta_mask; 3287 3288 if (!data) 3289 return IRQ_NONE; 3290 3291 spin_lock(&priv->low_lock); 3292 3293 /* We check to see if we should be ignoring interrupts before 3294 * we touch the hardware. During ucode load if we try and handle 3295 * an interrupt we can cause keyboard problems as well as cause 3296 * the ucode to fail to initialize */ 3297 if (!(priv->status & STATUS_INT_ENABLED)) { 3298 /* Shared IRQ */ 3299 goto none; 3300 } 3301 3302 read_register(priv->net_dev, IPW_REG_INTA_MASK, &inta_mask); 3303 read_register(priv->net_dev, IPW_REG_INTA, &inta); 3304 3305 if (inta == 0xFFFFFFFF) { 3306 /* Hardware disappeared */ 3307 printk(KERN_WARNING DRV_NAME ": IRQ INTA == 0xFFFFFFFF\n"); 3308 goto none; 3309 } 3310 3311 inta &= IPW_INTERRUPT_MASK; 3312 3313 if (!(inta & inta_mask)) { 3314 /* Shared interrupt */ 3315 goto none; 3316 } 3317 3318 /* We disable the hardware interrupt here just to prevent unneeded 3319 * calls to be made. We disable this again within the actual 3320 * work tasklet, so if another part of the code re-enables the 3321 * interrupt, that is fine */ 3322 ipw2100_disable_interrupts(priv); 3323 3324 tasklet_schedule(&priv->irq_tasklet); 3325 spin_unlock(&priv->low_lock); 3326 3327 return IRQ_HANDLED; 3328 none: 3329 spin_unlock(&priv->low_lock); 3330 return IRQ_NONE; 3331 } 3332 3333 static int ipw2100_tx(struct ieee80211_txb *txb, struct net_device *dev, 3334 int pri) 3335 { 3336 struct ipw2100_priv *priv = ieee80211_priv(dev); 3337 struct list_head *element; 3338 struct ipw2100_tx_packet *packet; 3339 unsigned long flags; 3340 3341 spin_lock_irqsave(&priv->low_lock, flags); 3342 3343 if (!(priv->status & STATUS_ASSOCIATED)) { 3344 IPW_DEBUG_INFO("Can not transmit when not connected.\n"); 3345 priv->net_dev->stats.tx_carrier_errors++; 3346 netif_stop_queue(dev); 3347 goto fail_unlock; 3348 } 3349 3350 if (list_empty(&priv->tx_free_list)) 3351 goto fail_unlock; 3352 3353 element = priv->tx_free_list.next; 3354 packet = list_entry(element, struct ipw2100_tx_packet, list); 3355 3356 packet->info.d_struct.txb = txb; 3357 3358 IPW_DEBUG_TX("Sending fragment (%d bytes):\n", txb->fragments[0]->len); 3359 printk_buf(IPW_DL_TX, txb->fragments[0]->data, txb->fragments[0]->len); 3360 3361 packet->jiffy_start = jiffies; 3362 3363 list_del(element); 3364 DEC_STAT(&priv->tx_free_stat); 3365 3366 list_add_tail(element, &priv->tx_pend_list); 3367 INC_STAT(&priv->tx_pend_stat); 3368 3369 ipw2100_tx_send_data(priv); 3370 3371 spin_unlock_irqrestore(&priv->low_lock, flags); 3372 return 0; 3373 3374 fail_unlock: 3375 netif_stop_queue(dev); 3376 spin_unlock_irqrestore(&priv->low_lock, flags); 3377 return 1; 3378 } |
