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 }


Reply via email to