Merge tag 'v4.2-rc3' into next
[firefly-linux-kernel-4.4.55.git] / drivers / staging / slicoss / slicoss.c
index c2bda1d38e41c1d21a500a69d2359f6dd43fe750..a609f3e67256aba12dbfda1fb9e1e2d3958c2f67 100644 (file)
@@ -144,17 +144,14 @@ static inline void slic_reg64_write(struct adapter *adapter, void __iomem *reg,
                                    u32 value, void __iomem *regh, u32 paddrh,
                                    bool flush)
 {
-       spin_lock_irqsave(&adapter->bit64reglock.lock,
-                               adapter->bit64reglock.flags);
-       if (paddrh != adapter->curaddrupper) {
-               adapter->curaddrupper = paddrh;
-               writel(paddrh, regh);
-       }
+       unsigned long flags;
+
+       spin_lock_irqsave(&adapter->bit64reglock, flags);
+       writel(paddrh, regh);
        writel(value, reg);
        if (flush)
                mb();
-       spin_unlock_irqrestore(&adapter->bit64reglock.lock,
-                               adapter->bit64reglock.flags);
+       spin_unlock_irqrestore(&adapter->bit64reglock, flags);
 }
 
 static void slic_mcast_set_bit(struct adapter *adapter, char *address)
@@ -936,9 +933,10 @@ static int slic_upr_request(struct adapter *adapter,
                     u32 upr_data_h,
                     u32 upr_buffer, u32 upr_buffer_h)
 {
+       unsigned long flags;
        int rc;
 
-       spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags);
+       spin_lock_irqsave(&adapter->upr_lockflags);
        rc = slic_upr_queue_request(adapter,
                                        upr_request,
                                        upr_data,
@@ -948,8 +946,7 @@ static int slic_upr_request(struct adapter *adapter,
 
        slic_upr_start(adapter);
 err_unlock_irq:
-       spin_unlock_irqrestore(&adapter->upr_lock.lock,
-                               adapter->upr_lock.flags);
+       spin_unlock_irqrestore(&adapter->upr_lock, flags);
        return rc;
 }
 
@@ -1029,12 +1026,12 @@ static void slic_upr_request_complete(struct adapter *adapter, u32 isr)
 {
        struct sliccard *card = adapter->card;
        struct slic_upr *upr;
+       unsigned long flags;
 
-       spin_lock_irqsave(&adapter->upr_lock.lock, adapter->upr_lock.flags);
+       spin_lock_irqsave(&adapter->upr_lockflags);
        upr = adapter->upr_list;
        if (!upr) {
-               spin_unlock_irqrestore(&adapter->upr_lock.lock,
-                                       adapter->upr_lock.flags);
+               spin_unlock_irqrestore(&adapter->upr_lock, flags);
                return;
        }
        adapter->upr_list = upr->next;
@@ -1127,8 +1124,7 @@ static void slic_upr_request_complete(struct adapter *adapter, u32 isr)
        }
        kfree(upr);
        slic_upr_start(adapter);
-       spin_unlock_irqrestore(&adapter->upr_lock.lock,
-                               adapter->upr_lock.flags);
+       spin_unlock_irqrestore(&adapter->upr_lock, flags);
 }
 
 static int slic_config_get(struct adapter *adapter, u32 config, u32 config_h)
@@ -1310,6 +1306,7 @@ static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page)
        u32 phys_addrl;
        u32 phys_addrh;
        struct slic_handle *pslic_handle;
+       unsigned long flags;
 
        cmdaddr = page;
        cmd = (struct slic_hostcmd *)cmdaddr;
@@ -1324,12 +1321,10 @@ static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page)
        while ((cmdcnt < SLIC_CMDQ_CMDSINPAGE) &&
               (adapter->slic_handle_ix < 256)) {
                /* Allocate and initialize a SLIC_HANDLE for this command */
-               spin_lock_irqsave(&adapter->handle_lock.lock,
-                               adapter->handle_lock.flags);
+               spin_lock_irqsave(&adapter->handle_lock, flags);
                pslic_handle  =  adapter->pfree_slic_handles;
                adapter->pfree_slic_handles = pslic_handle->next;
-               spin_unlock_irqrestore(&adapter->handle_lock.lock,
-                               adapter->handle_lock.flags);
+               spin_unlock_irqrestore(&adapter->handle_lock, flags);
                pslic_handle->type = SLIC_HANDLE_CMD;
                pslic_handle->address = (void *) cmd;
                pslic_handle->offset = (ushort) adapter->slic_handle_ix++;
@@ -1356,11 +1351,11 @@ static void slic_cmdq_addcmdpage(struct adapter *adapter, u32 *page)
        tail->next_all = cmdq->head;
        cmdq->head = prev;
        cmdq = &adapter->cmdq_free;
-       spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags);
+       spin_lock_irqsave(&cmdq->lockflags);
        cmdq->count += cmdcnt;  /*  SLIC_CMDQ_CMDSINPAGE;   mooktodo */
        tail->next = cmdq->head;
        cmdq->head = prev;
-       spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags);
+       spin_unlock_irqrestore(&cmdq->lockflags);
 }
 
 static int slic_cmdq_init(struct adapter *adapter)
@@ -1371,9 +1366,9 @@ static int slic_cmdq_init(struct adapter *adapter)
        memset(&adapter->cmdq_all, 0, sizeof(struct slic_cmdqueue));
        memset(&adapter->cmdq_free, 0, sizeof(struct slic_cmdqueue));
        memset(&adapter->cmdq_done, 0, sizeof(struct slic_cmdqueue));
-       spin_lock_init(&adapter->cmdq_all.lock.lock);
-       spin_lock_init(&adapter->cmdq_free.lock.lock);
-       spin_lock_init(&adapter->cmdq_done.lock.lock);
+       spin_lock_init(&adapter->cmdq_all.lock);
+       spin_lock_init(&adapter->cmdq_free.lock);
+       spin_lock_init(&adapter->cmdq_done.lock);
        memset(&adapter->cmdqmem, 0, sizeof(struct slic_cmdqmem));
        adapter->slic_handle_ix = 1;
        for (i = 0; i < SLIC_CMDQ_INITPAGES; i++) {
@@ -1394,11 +1389,10 @@ static void slic_cmdq_reset(struct adapter *adapter)
        struct slic_hostcmd *hcmd;
        struct sk_buff *skb;
        u32 outstanding;
+       unsigned long flags;
 
-       spin_lock_irqsave(&adapter->cmdq_free.lock.lock,
-                       adapter->cmdq_free.lock.flags);
-       spin_lock_irqsave(&adapter->cmdq_done.lock.lock,
-                       adapter->cmdq_done.lock.flags);
+       spin_lock_irqsave(&adapter->cmdq_free.lock, flags);
+       spin_lock(&adapter->cmdq_done.lock);
        outstanding = adapter->cmdq_all.count - adapter->cmdq_done.count;
        outstanding -= adapter->cmdq_free.count;
        hcmd = adapter->cmdq_all.head;
@@ -1429,40 +1423,40 @@ static void slic_cmdq_reset(struct adapter *adapter)
                        "free_count %d != all count %d\n",
                        adapter->cmdq_free.count, adapter->cmdq_all.count);
        }
-       spin_unlock_irqrestore(&adapter->cmdq_done.lock.lock,
-                               adapter->cmdq_done.lock.flags);
-       spin_unlock_irqrestore(&adapter->cmdq_free.lock.lock,
-                               adapter->cmdq_free.lock.flags);
+       spin_unlock(&adapter->cmdq_done.lock);
+       spin_unlock_irqrestore(&adapter->cmdq_free.lock, flags);
 }
 
 static void slic_cmdq_getdone(struct adapter *adapter)
 {
        struct slic_cmdqueue *done_cmdq = &adapter->cmdq_done;
        struct slic_cmdqueue *free_cmdq = &adapter->cmdq_free;
+       unsigned long flags;
 
-       spin_lock_irqsave(&done_cmdq->lock.lock, done_cmdq->lock.flags);
+       spin_lock_irqsave(&done_cmdq->lockflags);
 
        free_cmdq->head = done_cmdq->head;
        free_cmdq->count = done_cmdq->count;
        done_cmdq->head = NULL;
        done_cmdq->tail = NULL;
        done_cmdq->count = 0;
-       spin_unlock_irqrestore(&done_cmdq->lock.lock, done_cmdq->lock.flags);
+       spin_unlock_irqrestore(&done_cmdq->lockflags);
 }
 
 static struct slic_hostcmd *slic_cmdq_getfree(struct adapter *adapter)
 {
        struct slic_cmdqueue *cmdq = &adapter->cmdq_free;
        struct slic_hostcmd *cmd = NULL;
+       unsigned long flags;
 
 lock_and_retry:
-       spin_lock_irqsave(&cmdq->lock.lock, cmdq->lock.flags);
+       spin_lock_irqsave(&cmdq->lockflags);
 retry:
        cmd = cmdq->head;
        if (cmd) {
                cmdq->head = cmd->next;
                cmdq->count--;
-               spin_unlock_irqrestore(&cmdq->lock.lock, cmdq->lock.flags);
+               spin_unlock_irqrestore(&cmdq->lockflags);
        } else {
                slic_cmdq_getdone(adapter);
                cmd = cmdq->head;
@@ -1471,8 +1465,7 @@ retry:
                } else {
                        u32 *pageaddr;
 
-                       spin_unlock_irqrestore(&cmdq->lock.lock,
-                                               cmdq->lock.flags);
+                       spin_unlock_irqrestore(&cmdq->lock, flags);
                        pageaddr = slic_cmdqmem_addpage(adapter);
                        if (pageaddr) {
                                slic_cmdq_addcmdpage(adapter, pageaddr);
@@ -1488,14 +1481,14 @@ static void slic_cmdq_putdone_irq(struct adapter *adapter,
 {
        struct slic_cmdqueue *cmdq = &adapter->cmdq_done;
 
-       spin_lock(&cmdq->lock.lock);
+       spin_lock(&cmdq->lock);
        cmd->busy = 0;
        cmd->next = cmdq->head;
        cmdq->head = cmd;
        cmdq->count++;
        if ((adapter->xmitq_full) && (cmdq->count > 10))
                netif_wake_queue(adapter->netdev);
-       spin_unlock(&cmdq->lock.lock);
+       spin_unlock(&cmdq->lock);
 }
 
 static int slic_rcvqueue_fill(struct adapter *adapter)
@@ -2250,21 +2243,20 @@ static void slic_adapter_freeresources(struct adapter *adapter)
        adapter->rcv_unicasts = 0;
 }
 
-static int slic_adapter_allocresources(struct adapter *adapter)
+static int slic_adapter_allocresources(struct adapter *adapter,
+                                      unsigned long *flags)
 {
        if (!adapter->intrregistered) {
                int retval;
 
-               spin_unlock_irqrestore(&slic_global.driver_lock.lock,
-                                       slic_global.driver_lock.flags);
+               spin_unlock_irqrestore(&slic_global.driver_lock, *flags);
 
                retval = request_irq(adapter->netdev->irq,
                                     &slic_interrupt,
                                     IRQF_SHARED,
                                     adapter->netdev->name, adapter->netdev);
 
-               spin_lock_irqsave(&slic_global.driver_lock.lock,
-                                       slic_global.driver_lock.flags);
+               spin_lock_irqsave(&slic_global.driver_lock, *flags);
 
                if (retval) {
                        dev_err(&adapter->netdev->dev,
@@ -2283,7 +2275,7 @@ static int slic_adapter_allocresources(struct adapter *adapter)
  *  Perform initialization of our slic interface.
  *
  */
-static int slic_if_init(struct adapter *adapter)
+static int slic_if_init(struct adapter *adapter, unsigned long *flags)
 {
        struct sliccard *card = adapter->card;
        struct net_device *dev = adapter->netdev;
@@ -2311,7 +2303,7 @@ static int slic_if_init(struct adapter *adapter)
                if (dev->flags & IFF_MULTICAST)
                        adapter->macopts |= MAC_MCAST;
        }
-       rc = slic_adapter_allocresources(adapter);
+       rc = slic_adapter_allocresources(adapter, flags);
        if (rc) {
                dev_err(&dev->dev, "slic_adapter_allocresources FAILED %x\n",
                        rc);
@@ -2336,11 +2328,11 @@ static int slic_if_init(struct adapter *adapter)
        mdelay(1);
 
        if (!adapter->isp_initialized) {
+               unsigned long flags;
                pshmem = (struct slic_shmem *)(unsigned long)
                         adapter->phys_shmem;
 
-               spin_lock_irqsave(&adapter->bit64reglock.lock,
-                                       adapter->bit64reglock.flags);
+               spin_lock_irqsave(&adapter->bit64reglock, flags);
 
 #if BITS_PER_LONG == 64
                slic_reg32_write(&slic_regs->slic_addr_upper,
@@ -2352,8 +2344,7 @@ static int slic_if_init(struct adapter *adapter)
                slic_reg32_write(&slic_regs->slic_isp, (u32)&pshmem->isr,
                                FLUSH);
 #endif
-               spin_unlock_irqrestore(&adapter->bit64reglock.lock,
-                                       adapter->bit64reglock.flags);
+               spin_unlock_irqrestore(&adapter->bit64reglock, flags);
                adapter->isp_initialized = 1;
        }
 
@@ -2396,18 +2387,18 @@ static int slic_entry_open(struct net_device *dev)
 {
        struct adapter *adapter = netdev_priv(dev);
        struct sliccard *card = adapter->card;
+       unsigned long flags;
        int status;
 
        netif_stop_queue(adapter->netdev);
 
-       spin_lock_irqsave(&slic_global.driver_lock.lock,
-                               slic_global.driver_lock.flags);
+       spin_lock_irqsave(&slic_global.driver_lock, flags);
        if (!adapter->activated) {
                card->adapters_activated++;
                slic_global.num_slic_ports_active++;
                adapter->activated = 1;
        }
-       status = slic_if_init(adapter);
+       status = slic_if_init(adapter, &flags);
 
        if (status != 0) {
                if (adapter->activated) {
@@ -2421,8 +2412,7 @@ static int slic_entry_open(struct net_device *dev)
                card->master = adapter;
 
 spin_unlock:
-       spin_unlock_irqrestore(&slic_global.driver_lock.lock,
-                              slic_global.driver_lock.flags);
+       spin_unlock_irqrestore(&slic_global.driver_lock, flags);
        return status;
 }
 
@@ -2481,9 +2471,9 @@ static int slic_entry_halt(struct net_device *dev)
        struct adapter *adapter = netdev_priv(dev);
        struct sliccard *card = adapter->card;
        __iomem struct slic_regs *slic_regs = adapter->slic_regs;
+       unsigned long flags;
 
-       spin_lock_irqsave(&slic_global.driver_lock.lock,
-                               slic_global.driver_lock.flags);
+       spin_lock_irqsave(&slic_global.driver_lock, flags);
        netif_stop_queue(adapter->netdev);
        adapter->state = ADAPT_DOWN;
        adapter->linkstate = LINK_DOWN;
@@ -2512,8 +2502,7 @@ static int slic_entry_halt(struct net_device *dev)
                slic_card_init(card, adapter);
 #endif
 
-       spin_unlock_irqrestore(&slic_global.driver_lock.lock,
-                               slic_global.driver_lock.flags);
+       spin_unlock_irqrestore(&slic_global.driver_lock, flags);
        return 0;
 }
 
@@ -2663,6 +2652,7 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)
        unsigned char oemfruformat;
        struct atk_fru *patkfru;
        union oemfru *poemfru;
+       unsigned long flags;
 
        /* Reset everything except PCI configuration space */
        slic_soft_reset(adapter);
@@ -2693,14 +2683,12 @@ static int slic_card_init(struct sliccard *card, struct adapter *adapter)
                pshmem = (struct slic_shmem *)(unsigned long)
                         adapter->phys_shmem;
 
-               spin_lock_irqsave(&adapter->bit64reglock.lock,
-                                       adapter->bit64reglock.flags);
+               spin_lock_irqsave(&adapter->bit64reglock, flags);
                slic_reg32_write(&slic_regs->slic_addr_upper,
                                 SLIC_GET_ADDR_HIGH(&pshmem->isr), DONT_FLUSH);
                slic_reg32_write(&slic_regs->slic_isp,
                                 SLIC_GET_ADDR_LOW(&pshmem->isr), FLUSH);
-               spin_unlock_irqrestore(&adapter->bit64reglock.lock,
-                                       adapter->bit64reglock.flags);
+               spin_unlock_irqrestore(&adapter->bit64reglock, flags);
 
                status = slic_config_get(adapter, phys_configl, phys_configh);
                if (status) {
@@ -2854,7 +2842,7 @@ static void slic_init_driver(void)
 {
        if (slic_first_init) {
                slic_first_init = 0;
-               spin_lock_init(&slic_global.driver_lock.lock);
+               spin_lock_init(&slic_global.driver_lock);
        }
 }
 
@@ -2880,11 +2868,11 @@ static void slic_init_adapter(struct net_device *netdev,
        adapter->chipid = chip_idx;
        adapter->port = 0;      /*adapter->functionnumber;*/
        adapter->cardindex = adapter->port;
-       spin_lock_init(&adapter->upr_lock.lock);
-       spin_lock_init(&adapter->bit64reglock.lock);
-       spin_lock_init(&adapter->adapter_lock.lock);
-       spin_lock_init(&adapter->reset_lock.lock);
-       spin_lock_init(&adapter->handle_lock.lock);
+       spin_lock_init(&adapter->upr_lock);
+       spin_lock_init(&adapter->bit64reglock);
+       spin_lock_init(&adapter->adapter_lock);
+       spin_lock_init(&adapter->reset_lock);
+       spin_lock_init(&adapter->handle_lock);
 
        adapter->card_size = 1;
        /*