X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=inline;f=drivers%2Fnet%2Fskfp%2Fskfddi.c;h=4b5ed2c63177ff991716885c843c4fe331e26eaf;hb=987b0145d94eecf292d8b301228356f44611ab7c;hp=24032c79c1c5c0b203b763ec775ed61efffa47b0;hpb=daddc0d38b3571bed170afa273a49a0eba090c1e;p=linux-2.6.git diff --git a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c index 24032c79c..4b5ed2c63 100644 --- a/drivers/net/skfp/skfddi.c +++ b/drivers/net/skfp/skfddi.c @@ -83,9 +83,9 @@ static const char *boot_msg = #include #include #include +#include #include -#include #include #include @@ -131,20 +131,10 @@ void mac_drv_clear_rxd(struct s_smc *smc, volatile struct s_smt_fp_rxd *rxd, int frag_count); int mac_drv_rx_init(struct s_smc *smc, int len, int fc, char *look_ahead, int la_len); -void smt_timer_poll(struct s_smc *smc); -void ring_status_indication(struct s_smc *smc, u_long status); -unsigned long smt_get_time(void); -void smt_stat_counter(struct s_smc *smc, int stat); -void cfm_state_change(struct s_smc *smc, int c_state); -void ecm_state_change(struct s_smc *smc, int e_state); -void pcm_state_change(struct s_smc *smc, int plc, int p_state); -void rmt_state_change(struct s_smc *smc, int r_state); -void drv_reset_indication(struct s_smc *smc); void dump_data(unsigned char *Data, int length); - // External functions from the hardware module -extern u_int mac_drv_check_space(); +extern u_int mac_drv_check_space(void); extern void read_address(struct s_smc *smc, u_char * mac_addr); extern void card_stop(struct s_smc *smc); extern int mac_drv_init(struct s_smc *smc); @@ -157,11 +147,8 @@ extern void fddi_isr(struct s_smc *smc); extern void hwm_rx_frag(struct s_smc *smc, char far * virt, u_long phys, int len, int frame_status); extern void mac_drv_rx_mode(struct s_smc *smc, int mode); -extern void mac_drv_clear_tx_queue(struct s_smc *smc); extern void mac_drv_clear_rx_queue(struct s_smc *smc); -extern void mac_clear_multicast(struct s_smc *smc); extern void enable_tx_irq(struct s_smc *smc, u_short queue); -extern void mac_drv_clear_txd(struct s_smc *smc); static struct pci_device_id skfddi_pci_tbl[] = { { PCI_VENDOR_ID_SK, PCI_DEVICE_ID_SK_FP, PCI_ANY_ID, PCI_ANY_ID, }, @@ -181,8 +168,6 @@ static int num_boards; /* total number of adapters configured */ #define PRINTK(s, args...) #endif // DRIVERDEBUG -#define PRIV(dev) (&(((struct s_smc *)dev->priv)->os)) - /* * ================= * = skfp_init_one = @@ -217,7 +202,7 @@ static int skfp_init_one(struct pci_dev *pdev, { struct net_device *dev; struct s_smc *smc; /* board pointer */ - unsigned long port, len; + void __iomem *mem; int err; PRINTK(KERN_INFO "entering skfp_init_one\n"); @@ -226,65 +211,46 @@ static int skfp_init_one(struct pci_dev *pdev, printk("%s\n", boot_msg); err = pci_enable_device(pdev); + if (err) + return err; + + err = pci_request_regions(pdev, "skfddi"); if (err) goto err_out1; + pci_set_master(pdev); #ifdef MEM_MAPPED_IO if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { printk(KERN_ERR "skfp: region is not an MMIO resource\n"); err = -EIO; - goto err_out1; + goto err_out2; } - port = pci_resource_start(pdev, 0); - len = pci_resource_len(pdev, 0); - if (len < 0x4000) { - printk(KERN_ERR "skfp: Invalid PCI region size: %lu\n", len); - err = -EIO; - goto err_out1; - } + mem = ioremap(pci_resource_start(pdev, 0), 0x4000); #else if (!(pci_resource_flags(pdev, 1) & IO_RESOURCE_IO)) { printk(KERN_ERR "skfp: region is not PIO resource\n"); err = -EIO; - goto err_out1; + goto err_out2; } - port = pci_resource_start(pdev, 1); - len = pci_resource_len(pdev, 1); - if (len < FP_IO_LEN) { - printk(KERN_ERR "skfp: Invalid PCI region size: %d\n", - io_len); + mem = ioport_map(pci_resource_start(pdev, 1), FP_IO_LEN); +#endif + if (!mem) { + printk(KERN_ERR "skfp: Unable to map register, " + "FDDI adapter will be disabled.\n"); err = -EIO; - goto err_out1; + goto err_out2; } -#endif - err = pci_request_regions(pdev, "skfddi"); - if (err) - goto err_out1; - - pci_set_master(pdev); dev = alloc_fddidev(sizeof(struct s_smc)); if (!dev) { printk(KERN_ERR "skfp: Unable to allocate fddi device, " "FDDI adapter will be disabled.\n"); err = -ENOMEM; - goto err_out2; - } - -#ifdef MEM_MAPPED_IO - dev->base_addr = (unsigned long) ioremap(port, len); - if (!dev->base_addr) { - printk(KERN_ERR "skfp: Unable to map MEMORY register, " - "FDDI adapter will be disabled.\n"); - err = -EIO; goto err_out3; } -#else - dev->base_addr = port; -#endif dev->irq = pdev->irq; dev->get_stats = &skfp_ctl_get_stats; @@ -300,7 +266,7 @@ static int skfp_init_one(struct pci_dev *pdev, SET_NETDEV_DEV(dev, &pdev->dev); /* Initialize board structure with bus-specific info */ - smc = (struct s_smc *) dev->priv; + smc = netdev_priv(dev); smc->os.dev = dev; smc->os.bus_type = SK_BUS_TYPE_PCI; smc->os.pdev = *pdev; @@ -308,9 +274,12 @@ static int skfp_init_one(struct pci_dev *pdev, smc->os.MaxFrameSize = MAX_FRAME_SIZE; smc->os.dev = dev; smc->hw.slot = -1; + smc->hw.iop = mem; smc->os.ResetRequested = FALSE; skb_queue_head_init(&smc->os.SendSkbQueue); + dev->base_addr = (unsigned long)mem; + err = skfp_driver_init(dev); if (err) goto err_out4; @@ -339,14 +308,17 @@ err_out5: pci_free_consistent(pdev, MAX_FRAME_SIZE, smc->os.LocalRxBuffer, smc->os.LocalRxBufferDMA); err_out4: + free_netdev(dev); +err_out3: #ifdef MEM_MAPPED_IO - iounmap((void *) dev->base_addr); + iounmap(mem); +#else + ioport_unmap(mem); #endif -err_out3: - free_netdev(dev); err_out2: pci_release_regions(pdev); err_out1: + pci_disable_device(pdev); return err; } @@ -356,7 +328,7 @@ err_out1: static void __devexit skfp_remove_one(struct pci_dev *pdev) { struct net_device *p = pci_get_drvdata(pdev); - struct s_smc *lp = p->priv; + struct s_smc *lp = netdev_priv(p); unregister_netdev(p); @@ -375,11 +347,14 @@ static void __devexit skfp_remove_one(struct pci_dev *pdev) lp->os.LocalRxBuffer = NULL; } #ifdef MEM_MAPPED_IO - iounmap((void *) p->base_addr); + iounmap(lp->hw.iop); +#else + ioport_unmap(lp->hw.iop); #endif pci_release_regions(pdev); free_netdev(p); + pci_disable_device(pdev); pci_set_drvdata(pdev, NULL); } @@ -410,15 +385,14 @@ static void __devexit skfp_remove_one(struct pci_dev *pdev) */ static int skfp_driver_init(struct net_device *dev) { - struct s_smc *smc = (struct s_smc *) dev->priv; - skfddi_priv *bp = PRIV(dev); + struct s_smc *smc = netdev_priv(dev); + skfddi_priv *bp = &smc->os; int err = -EIO; PRINTK(KERN_INFO "entering skfp_driver_init\n"); // set the io address in private structures bp->base_addr = dev->base_addr; - smc->hw.iop = dev->base_addr; // Get the interrupt level from the PCI Configuration Table smc->hw.irq = dev->irq; @@ -518,7 +492,7 @@ fail: */ static int skfp_open(struct net_device *dev) { - struct s_smc *smc = (struct s_smc *) dev->priv; + struct s_smc *smc = netdev_priv(dev); int err; PRINTK(KERN_INFO "entering skfp_open\n"); @@ -585,8 +559,8 @@ static int skfp_open(struct net_device *dev) */ static int skfp_close(struct net_device *dev) { - struct s_smc *smc = (struct s_smc *) dev->priv; - skfddi_priv *bp = PRIV(dev); + struct s_smc *smc = netdev_priv(dev); + skfddi_priv *bp = &smc->os; CLI_FBI(); smt_reset_defaults(smc, 1); @@ -645,15 +619,15 @@ irqreturn_t skfp_interrupt(int irq, void *dev_id, struct pt_regs *regs) { struct net_device *dev = (struct net_device *) dev_id; struct s_smc *smc; /* private board structure pointer */ - skfddi_priv *bp = PRIV(dev); - + skfddi_priv *bp; if (dev == NULL) { printk("%s: irq %d for unknown device\n", dev->name, irq); return IRQ_NONE; } - smc = (struct s_smc *) dev->priv; + smc = netdev_priv(dev); + bp = &smc->os; // IRQs enabled or disabled ? if (inpd(ADDR(B0_IMSK)) == 0) { @@ -715,7 +689,7 @@ irqreturn_t skfp_interrupt(int irq, void *dev_id, struct pt_regs *regs) */ struct net_device_stats *skfp_ctl_get_stats(struct net_device *dev) { - struct s_smc *bp = (struct s_smc *) dev->priv; + struct s_smc *bp = netdev_priv(dev); /* Fill the bp->stats structure with driver-maintained counters */ @@ -879,7 +853,8 @@ struct net_device_stats *skfp_ctl_get_stats(struct net_device *dev) */ static void skfp_ctl_set_multicast_list(struct net_device *dev) { - skfddi_priv *bp = PRIV(dev); + struct s_smc *smc = netdev_priv(dev); + skfddi_priv *bp = &smc->os; unsigned long Flags; spin_lock_irqsave(&bp->DriverLock, Flags); @@ -892,7 +867,7 @@ static void skfp_ctl_set_multicast_list(struct net_device *dev) static void skfp_ctl_set_multicast_list_wo_lock(struct net_device *dev) { - struct s_smc *smc = (struct s_smc *) dev->priv; + struct s_smc *smc = netdev_priv(dev); struct dev_mc_list *dmi; /* ptr to multicast addr entry */ int i; @@ -921,8 +896,10 @@ static void skfp_ctl_set_multicast_list_wo_lock(struct net_device *dev) dmi = dev->mc_list; for (i = 0; i < dev->mc_count; i++) { - mac_add_multicast(smc, - dmi->dmi_addr, 1); + mac_add_multicast(smc, + (struct fddi_addr *)dmi->dmi_addr, + 1); + PRINTK(KERN_INFO "ENABLE MC ADDRESS:"); PRINTK(" %02x %02x %02x ", dmi->dmi_addr[0], @@ -973,9 +950,9 @@ static void skfp_ctl_set_multicast_list_wo_lock(struct net_device *dev) */ static int skfp_ctl_set_mac_address(struct net_device *dev, void *addr) { - struct s_smc *smc = (struct s_smc *) dev->priv; + struct s_smc *smc = netdev_priv(dev); struct sockaddr *p_sockaddr = (struct sockaddr *) addr; - skfddi_priv *bp = (skfddi_priv *) & smc->os; + skfddi_priv *bp = &smc->os; unsigned long Flags; @@ -1013,12 +990,14 @@ static int skfp_ctl_set_mac_address(struct net_device *dev, void *addr) static int skfp_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) { - skfddi_priv *lp = PRIV(dev); + struct s_smc *smc = netdev_priv(dev); + skfddi_priv *lp = &smc->os; struct s_skfp_ioctl ioc; int status = 0; if (copy_from_user(&ioc, rq->ifr_data, sizeof(struct s_skfp_ioctl))) return -EFAULT; + switch (ioc.cmd) { case SKFP_GET_STATS: /* Get the driver statistics */ ioc.len = sizeof(lp->MacStat); @@ -1091,7 +1070,8 @@ static int skfp_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) */ static int skfp_send_pkt(struct sk_buff *skb, struct net_device *dev) { - skfddi_priv *bp = PRIV(dev); + struct s_smc *smc = netdev_priv(dev); + skfddi_priv *bp = &smc->os; PRINTK(KERN_INFO "skfp_send_pkt\n"); @@ -1105,7 +1085,7 @@ static int skfp_send_pkt(struct sk_buff *skb, struct net_device *dev) */ if (!(skb->len >= FDDI_K_LLC_ZLEN && skb->len <= FDDI_K_LLC_LEN)) { - bp->MacStat.tx_errors++; /* bump error counter */ + bp->MacStat.gen.tx_errors++; /* bump error counter */ // dequeue packets from xmt queue and send them netif_start_queue(dev); dev_kfree_skb(skb); @@ -1118,7 +1098,7 @@ static int skfp_send_pkt(struct sk_buff *skb, struct net_device *dev) } bp->QueueSkb--; skb_queue_tail(&bp->SendSkbQueue, skb); - send_queued_packets((struct s_smc *) dev->priv); + send_queued_packets(netdev_priv(dev)); if (bp->QueueSkb == 0) { netif_stop_queue(dev); } @@ -1153,7 +1133,7 @@ static int skfp_send_pkt(struct sk_buff *skb, struct net_device *dev) */ static void send_queued_packets(struct s_smc *smc) { - skfddi_priv *bp = (skfddi_priv *) & smc->os; + skfddi_priv *bp = &smc->os; struct sk_buff *skb; unsigned char fc; int queue; @@ -1325,7 +1305,7 @@ static void ResetAdapter(struct s_smc *smc) ************************/ void llc_restart_tx(struct s_smc *smc) { - skfddi_priv *bp = (skfddi_priv *) & smc->os; + skfddi_priv *bp = &smc->os; PRINTK(KERN_INFO "[llc_restart_tx]\n"); @@ -1509,7 +1489,7 @@ void dma_complete(struct s_smc *smc, volatile union s_fp_descr *descr, int flag) * unmap first, the hardware module could read inconsistent data. */ if (flag & DMA_WR) { - skfddi_priv *bp = (skfddi_priv *) & smc->os; + skfddi_priv *bp = &smc->os; volatile struct s_smt_fp_rxd *r = &descr->r; /* If SKB is NULL, we used the local buffer. */ @@ -1556,8 +1536,8 @@ void mac_drv_tx_complete(struct s_smc *smc, volatile struct s_smt_fp_txd *txd) skb->len, PCI_DMA_TODEVICE); txd->txd_os.dma_addr = 0; - smc->os.MacStat.tx_packets++; // Count transmitted packets. - smc->os.MacStat.tx_bytes+=skb->len; // Count bytes + smc->os.MacStat.gen.tx_packets++; // Count transmitted packets. + smc->os.MacStat.gen.tx_bytes+=skb->len; // Count bytes // free the skb dev_kfree_skb_irq(skb); @@ -1623,7 +1603,7 @@ void dump_data(unsigned char *Data, int length) void mac_drv_rx_complete(struct s_smc *smc, volatile struct s_smt_fp_rxd *rxd, int frag_count, int len) { - skfddi_priv *bp = (skfddi_priv *) & smc->os; + skfddi_priv *bp = &smc->os; struct sk_buff *skb; unsigned char *virt, *cp; unsigned short ri; @@ -1639,7 +1619,7 @@ void mac_drv_rx_complete(struct s_smc *smc, volatile struct s_smt_fp_rxd *rxd, skb = rxd->rxd_os.skb; if (!skb) { PRINTK(KERN_INFO "No skb in rxd\n"); - smc->os.MacStat.rx_errors++; + smc->os.MacStat.gen.rx_errors++; goto RequeueRxd; } virt = skb->data; @@ -1692,13 +1672,14 @@ void mac_drv_rx_complete(struct s_smc *smc, volatile struct s_smt_fp_rxd *rxd, } // Count statistics. - smc->os.MacStat.rx_packets++; // Count indicated receive packets. - smc->os.MacStat.rx_bytes+=len; // Count bytes + smc->os.MacStat.gen.rx_packets++; // Count indicated receive + // packets. + smc->os.MacStat.gen.rx_bytes+=len; // Count bytes. // virt points to header again if (virt[1] & 0x01) { // Check group (multicast) bit. - smc->os.MacStat.multicast++; + smc->os.MacStat.gen.multicast++; } // deliver frame to system @@ -1716,7 +1697,8 @@ void mac_drv_rx_complete(struct s_smc *smc, volatile struct s_smt_fp_rxd *rxd, RequeueRxd: PRINTK(KERN_INFO "Rx: re-queue RXD.\n"); mac_drv_requeue_rxd(smc, rxd, frag_count); - smc->os.MacStat.rx_errors++; // Count receive packets not indicated. + smc->os.MacStat.gen.rx_errors++; // Count receive packets + // not indicated. } // mac_drv_rx_complete @@ -1753,7 +1735,7 @@ void mac_drv_requeue_rxd(struct s_smc *smc, volatile struct s_smt_fp_rxd *rxd, printk("fddi: Multi-fragment requeue!\n"); - MaxFrameSize = ((skfddi_priv *) & smc->os)->MaxFrameSize; + MaxFrameSize = smc->os.MaxFrameSize; src_rxd = rxd; for (; frag_count > 0; frag_count--) { next_rxd = src_rxd->rxd_next; @@ -1829,7 +1811,7 @@ void mac_drv_fill_rxd(struct s_smc *smc) // Walk through the list of free receive buffers, passing receive // buffers to the HWM as long as RXDs are available. - MaxFrameSize = ((skfddi_priv *) & smc->os)->MaxFrameSize; + MaxFrameSize = smc->os.MaxFrameSize; // Check if there is any RXD left. while (HWM_GET_RX_FREE(smc) > 0) { PRINTK(KERN_INFO ".\n"); @@ -1898,7 +1880,7 @@ void mac_drv_clear_rxd(struct s_smc *smc, volatile struct s_smt_fp_rxd *rxd, for (; frag_count > 0; frag_count--) { skb = rxd->rxd_os.skb; if (skb != NULL) { - skfddi_priv *bp = (skfddi_priv *) & smc->os; + skfddi_priv *bp = &smc->os; int MaxFrameSize = bp->MaxFrameSize; pci_unmap_single(&bp->pdev, rxd->rxd_os.dma_addr, @@ -1965,7 +1947,7 @@ int mac_drv_rx_init(struct s_smc *smc, int len, int fc, memcpy(skb->data, look_ahead, len); // deliver frame to system - skb->protocol = fddi_type_trans(skb, ((skfddi_priv *) & smc->os)->dev); + skb->protocol = fddi_type_trans(skb, smc->os.dev); skb->dev->last_rx = jiffies; netif_rx(skb); @@ -2091,7 +2073,7 @@ void smt_stat_counter(struct s_smc *smc, int stat) break; case 1: PRINTK(KERN_INFO "Receive fifo overflow.\n"); - smc->os.MacStat.rx_errors++; + smc->os.MacStat.gen.rx_errors++; break; default: PRINTK(KERN_INFO "Unknown status (%d).\n", stat);