]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/staging/slicoss/slicoss.c
Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / drivers / staging / slicoss / slicoss.c
index 872717024fd05d16ee41eb051d9255a98d5e0796..7daeced317c4ac050701cd8ab653e8f665ffc32a 100644 (file)
@@ -194,14 +194,10 @@ MODULE_PARM_DESC(dynamic_intagg, "Dynamic Interrupt Aggregation Setting");
 module_param(intagg_delay, int, 0);
 MODULE_PARM_DESC(intagg_delay, "uSec Interrupt Aggregation Delay");
 
-static struct pci_device_id slic_pci_tbl[] __devinitdata = {
-       {PCI_VENDOR_ID_ALACRITECH,
-        SLIC_1GB_DEVICE_ID,
-        PCI_ANY_ID, PCI_ANY_ID,},
-       {PCI_VENDOR_ID_ALACRITECH,
-        SLIC_2GB_DEVICE_ID,
-        PCI_ANY_ID, PCI_ANY_ID,},
-       {0,}
+static DEFINE_PCI_DEVICE_TABLE(slic_pci_tbl) = {
+       { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_1GB_DEVICE_ID) },
+       { PCI_DEVICE(PCI_VENDOR_ID_ALACRITECH, SLIC_2GB_DEVICE_ID) },
+       { 0 }
 };
 
 MODULE_DEVICE_TABLE(pci, slic_pci_tbl);
@@ -370,6 +366,7 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,
        ulong mmio_start = 0;
        ulong mmio_len = 0;
        struct sliccard *card = NULL;
+       int pci_using_dac = 0;
 
        slic_global.dynamic_intagg = dynamic_intagg;
 
@@ -383,16 +380,26 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,
                printk(KERN_DEBUG "%s\n", slic_proc_version);
        }
 
-       err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(64));
-       if (err) {
-               err = pci_set_dma_mask(pcidev, DMA_BIT_MASK(32));
-               if (err)
+       if (!pci_set_dma_mask(pcidev, DMA_BIT_MASK(64))) {
+               pci_using_dac = 1;
+               if (pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(64))) {
+                       dev_err(&pcidev->dev, "unable to obtain 64-bit DMA for "
+                                       "consistent allocations\n");
                        goto err_out_disable_pci;
+               }
+       } else if (pci_set_dma_mask(pcidev, DMA_BIT_MASK(32))) {
+               pci_using_dac = 0;
+               pci_set_consistent_dma_mask(pcidev, DMA_BIT_MASK(32));
+       } else {
+               dev_err(&pcidev->dev, "no usable DMA configuration\n");
+               goto err_out_disable_pci;
        }
 
        err = pci_request_regions(pcidev, DRV_NAME);
-       if (err)
+       if (err) {
+               dev_err(&pcidev->dev, "can't obtain PCI resources\n");
                goto err_out_disable_pci;
+       }
 
        pci_set_master(pcidev);
 
@@ -408,6 +415,8 @@ static int __devinit slic_entry_probe(struct pci_dev *pcidev,
        adapter = netdev_priv(netdev);
        adapter->netdev = netdev;
        adapter->pcidev = pcidev;
+       if (pci_using_dac)
+               netdev->features |= NETIF_F_HIGHDMA;
 
        mmio_start = pci_resource_start(pcidev, 0);
        mmio_len = pci_resource_len(pcidev, 0);
@@ -649,8 +658,7 @@ static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 
                        if (copy_from_user(data, rq->ifr_data, 28)) {
                                PRINT_ERROR
-                                   ("slic: copy_from_user FAILED getting \
-                                    initial simba param\n");
+                                   ("slic: copy_from_user FAILED getting initial simba param\n");
                                return -EFAULT;
                        }
 
@@ -665,8 +673,7 @@ static int slic_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
                                   (tracemon_request ==
                                    SLIC_DUMP_IN_PROGRESS)) {
                                PRINT_ERROR
-                                   ("ATK Diagnostic Trace Dump Requested but \
-                                    already in progress... ignore\n");
+                                   ("ATK Diagnostic Trace Dump Requested but already in progress... ignore\n");
                        } else {
                                PRINT_ERROR
                                    ("ATK Diagnostic Trace Dump Requested\n");
@@ -1253,13 +1260,11 @@ static struct net_device_stats *slic_get_stats(struct net_device *dev)
 static int slic_mcast_add_list(struct adapter *adapter, char *address)
 {
        struct mcast_address *mcaddr, *mlist;
-       bool equaladdr;
 
        /* Check to see if it already exists */
        mlist = adapter->mcastaddrs;
        while (mlist) {
-               ETHER_EQ_ADDR(mlist->address, address, equaladdr);
-               if (equaladdr)
+               if (!compare_ether_addr(mlist->address, address))
                        return STATUS_SUCCESS;
                mlist = mlist->next;
        }
@@ -1361,25 +1366,17 @@ static void slic_mcast_set_list(struct net_device *dev)
 {
        struct adapter *adapter = netdev_priv(dev);
        int status = STATUS_SUCCESS;
-       int i;
        char *addresses;
-       struct dev_mc_list *mc_list = dev->mc_list;
-       int mc_count = dev->mc_count;
+       struct dev_mc_list *mc_list;
 
        ASSERT(adapter);
 
-       for (i = 1; i <= mc_count; i++) {
+       netdev_for_each_mc_addr(mc_list, dev) {
                addresses = (char *) &mc_list->dmi_addr;
-               if (mc_list->dmi_addrlen == 6) {
-                       status = slic_mcast_add_list(adapter, addresses);
-                       if (status != STATUS_SUCCESS)
-                               break;
-               } else {
-                       status = -EINVAL;
+               status = slic_mcast_add_list(adapter, addresses);
+               if (status != STATUS_SUCCESS)
                        break;
-               }
                slic_mcast_set_bit(adapter, addresses);
-               mc_list = mc_list->next;
        }
 
        if (adapter->devflags_prev != dev->flags) {
@@ -1859,6 +1856,9 @@ static int slic_card_download_gbrcv(struct adapter *adapter)
        return 0;
 }
 
+MODULE_FIRMWARE("slicoss/oasisrcvucode.sys");
+MODULE_FIRMWARE("slicoss/gbrcvucode.sys");
+
 static int slic_card_download(struct adapter *adapter)
 {
        const struct firmware *fw;
@@ -1970,6 +1970,9 @@ static int slic_card_download(struct adapter *adapter)
        return STATUS_SUCCESS;
 }
 
+MODULE_FIRMWARE("slicoss/oasisdownload.sys");
+MODULE_FIRMWARE("slicoss/gbdownload.sys");
+
 static void slic_adapter_set_hwaddr(struct adapter *adapter)
 {
        struct sliccard *card = adapter->card;
@@ -2473,7 +2476,6 @@ static bool slic_mac_filter(struct adapter *adapter,
        u32 opts = adapter->macopts;
        u32 *dhost4 = (u32 *)&ether_frame->ether_dhost[0];
        u16 *dhost2 = (u16 *)&ether_frame->ether_dhost[4];
-       bool equaladdr;
 
        if (opts & MAC_PROMISC)
                return true;
@@ -2497,10 +2499,8 @@ static bool slic_mac_filter(struct adapter *adapter,
                        struct mcast_address *mcaddr = adapter->mcastaddrs;
 
                        while (mcaddr) {
-                               ETHER_EQ_ADDR(mcaddr->address,
-                                             ether_frame->ether_dhost,
-                                             equaladdr);
-                               if (equaladdr) {
+                               if (!compare_ether_addr(mcaddr->address,
+                                                       ether_frame->ether_dhost)) {
                                        adapter->rcv_multicasts++;
                                        adapter->stats.multicast++;
                                        return true;