Commit 6fdfa970 authored by Scott Feldman's avatar Scott Feldman Committed by David S. Miller

enic: organize device initialization/deinit into separate functions

To unclutter probe() a little bit, put all device initialization code
in one spot and device deinit code in another spot.  Also remove unused
rq->buf_index variable/func.
Signed-off-by: default avatarScott Feldman <scofeldm@cisco.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 491598a4
...@@ -1741,6 +1741,88 @@ static const struct net_device_ops enic_netdev_ops = { ...@@ -1741,6 +1741,88 @@ static const struct net_device_ops enic_netdev_ops = {
#endif #endif
}; };
void enic_dev_deinit(struct enic *enic)
{
netif_napi_del(&enic->napi);
enic_free_vnic_resources(enic);
enic_clear_intr_mode(enic);
}
int enic_dev_init(struct enic *enic)
{
struct net_device *netdev = enic->netdev;
int err;
/* Get vNIC configuration
*/
err = enic_get_vnic_config(enic);
if (err) {
printk(KERN_ERR PFX
"Get vNIC configuration failed, aborting.\n");
return err;
}
/* Get available resource counts
*/
enic_get_res_counts(enic);
/* Set interrupt mode based on resource counts and system
* capabilities
*/
err = enic_set_intr_mode(enic);
if (err) {
printk(KERN_ERR PFX
"Failed to set intr mode, aborting.\n");
return err;
}
/* Allocate and configure vNIC resources
*/
err = enic_alloc_vnic_resources(enic);
if (err) {
printk(KERN_ERR PFX
"Failed to alloc vNIC resources, aborting.\n");
goto err_out_free_vnic_resources;
}
enic_init_vnic_resources(enic);
err = enic_set_rq_alloc_buf(enic);
if (err) {
printk(KERN_ERR PFX
"Failed to set RQ buffer allocator, aborting.\n");
goto err_out_free_vnic_resources;
}
err = enic_set_niccfg(enic);
if (err) {
printk(KERN_ERR PFX
"Failed to config nic, aborting.\n");
goto err_out_free_vnic_resources;
}
switch (vnic_dev_get_intr_mode(enic->vdev)) {
default:
netif_napi_add(netdev, &enic->napi, enic_poll, 64);
break;
case VNIC_DEV_INTR_MODE_MSIX:
netif_napi_add(netdev, &enic->napi, enic_poll_msix, 64);
break;
}
return 0;
err_out_free_vnic_resources:
enic_clear_intr_mode(enic);
enic_free_vnic_resources(enic);
return err;
}
static void enic_iounmap(struct enic *enic) static void enic_iounmap(struct enic *enic)
{ {
unsigned int i; unsigned int i;
...@@ -1883,51 +1965,13 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -1883,51 +1965,13 @@ static int __devinit enic_probe(struct pci_dev *pdev,
goto err_out_dev_close; goto err_out_dev_close;
} }
/* Get vNIC configuration err = enic_dev_init(enic);
*/
err = enic_get_vnic_config(enic);
if (err) { if (err) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
"Get vNIC configuration failed, aborting.\n"); "Device initialization failed, aborting.\n");
goto err_out_dev_close; goto err_out_dev_close;
} }
/* Get available resource counts
*/
enic_get_res_counts(enic);
/* Set interrupt mode based on resource counts and system
* capabilities
*/
err = enic_set_intr_mode(enic);
if (err) {
printk(KERN_ERR PFX
"Failed to set intr mode, aborting.\n");
goto err_out_dev_close;
}
/* Allocate and configure vNIC resources
*/
err = enic_alloc_vnic_resources(enic);
if (err) {
printk(KERN_ERR PFX
"Failed to alloc vNIC resources, aborting.\n");
goto err_out_free_vnic_resources;
}
enic_init_vnic_resources(enic);
err = enic_set_niccfg(enic);
if (err) {
printk(KERN_ERR PFX
"Failed to config nic, aborting.\n");
goto err_out_free_vnic_resources;
}
/* Setup notification timer, HW reset task, and locks /* Setup notification timer, HW reset task, and locks
*/ */
...@@ -1952,22 +1996,13 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -1952,22 +1996,13 @@ static int __devinit enic_probe(struct pci_dev *pdev,
if (err) { if (err) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
"Invalid MAC address, aborting.\n"); "Invalid MAC address, aborting.\n");
goto err_out_free_vnic_resources; goto err_out_dev_deinit;
} }
netdev->netdev_ops = &enic_netdev_ops; netdev->netdev_ops = &enic_netdev_ops;
netdev->watchdog_timeo = 2 * HZ; netdev->watchdog_timeo = 2 * HZ;
netdev->ethtool_ops = &enic_ethtool_ops; netdev->ethtool_ops = &enic_ethtool_ops;
switch (vnic_dev_get_intr_mode(enic->vdev)) {
default:
netif_napi_add(netdev, &enic->napi, enic_poll, 64);
break;
case VNIC_DEV_INTR_MODE_MSIX:
netif_napi_add(netdev, &enic->napi, enic_poll_msix, 64);
break;
}
netdev->features |= NETIF_F_HW_VLAN_TX | netdev->features |= NETIF_F_HW_VLAN_TX |
NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER; NETIF_F_HW_VLAN_RX | NETIF_F_HW_VLAN_FILTER;
if (ENIC_SETTING(enic, TXCSUM)) if (ENIC_SETTING(enic, TXCSUM))
...@@ -1995,17 +2030,16 @@ static int __devinit enic_probe(struct pci_dev *pdev, ...@@ -1995,17 +2030,16 @@ static int __devinit enic_probe(struct pci_dev *pdev,
if (err) { if (err) {
printk(KERN_ERR PFX printk(KERN_ERR PFX
"Cannot register net device, aborting.\n"); "Cannot register net device, aborting.\n");
goto err_out_free_vnic_resources; goto err_out_dev_deinit;
} }
return 0; return 0;
err_out_free_vnic_resources: err_out_dev_deinit:
enic_free_vnic_resources(enic); enic_dev_deinit(enic);
err_out_dev_close: err_out_dev_close:
vnic_dev_close(enic->vdev); vnic_dev_close(enic->vdev);
err_out_vnic_unregister: err_out_vnic_unregister:
enic_clear_intr_mode(enic);
vnic_dev_unregister(enic->vdev); vnic_dev_unregister(enic->vdev);
err_out_iounmap: err_out_iounmap:
enic_iounmap(enic); enic_iounmap(enic);
...@@ -2029,9 +2063,8 @@ static void __devexit enic_remove(struct pci_dev *pdev) ...@@ -2029,9 +2063,8 @@ static void __devexit enic_remove(struct pci_dev *pdev)
flush_scheduled_work(); flush_scheduled_work();
unregister_netdev(netdev); unregister_netdev(netdev);
enic_free_vnic_resources(enic); enic_dev_deinit(enic);
vnic_dev_close(enic->vdev); vnic_dev_close(enic->vdev);
enic_clear_intr_mode(enic);
vnic_dev_unregister(enic->vdev); vnic_dev_unregister(enic->vdev);
enic_iounmap(enic); enic_iounmap(enic);
pci_release_regions(pdev); pci_release_regions(pdev);
......
...@@ -62,7 +62,6 @@ static int vnic_rq_alloc_bufs(struct vnic_rq *rq) ...@@ -62,7 +62,6 @@ static int vnic_rq_alloc_bufs(struct vnic_rq *rq)
} }
rq->to_use = rq->to_clean = rq->bufs[0]; rq->to_use = rq->to_clean = rq->bufs[0];
rq->buf_index = 0;
return 0; return 0;
} }
...@@ -113,12 +112,12 @@ int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index, ...@@ -113,12 +112,12 @@ int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
return 0; return 0;
} }
void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index, void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
unsigned int fetch_index, unsigned int posted_index,
unsigned int error_interrupt_enable, unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset) unsigned int error_interrupt_offset)
{ {
u64 paddr; u64 paddr;
u32 fetch_index;
paddr = (u64)rq->ring.base_addr | VNIC_PADDR_TARGET; paddr = (u64)rq->ring.base_addr | VNIC_PADDR_TARGET;
writeq(paddr, &rq->ctrl->ring_base); writeq(paddr, &rq->ctrl->ring_base);
...@@ -128,15 +127,27 @@ void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index, ...@@ -128,15 +127,27 @@ void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
iowrite32(error_interrupt_offset, &rq->ctrl->error_interrupt_offset); iowrite32(error_interrupt_offset, &rq->ctrl->error_interrupt_offset);
iowrite32(0, &rq->ctrl->dropped_packet_count); iowrite32(0, &rq->ctrl->dropped_packet_count);
iowrite32(0, &rq->ctrl->error_status); iowrite32(0, &rq->ctrl->error_status);
iowrite32(fetch_index, &rq->ctrl->fetch_index);
iowrite32(posted_index, &rq->ctrl->posted_index);
/* Use current fetch_index as the ring starting point */
fetch_index = ioread32(&rq->ctrl->fetch_index);
rq->to_use = rq->to_clean = rq->to_use = rq->to_clean =
&rq->bufs[fetch_index / VNIC_RQ_BUF_BLK_ENTRIES] &rq->bufs[fetch_index / VNIC_RQ_BUF_BLK_ENTRIES]
[fetch_index % VNIC_RQ_BUF_BLK_ENTRIES]; [fetch_index % VNIC_RQ_BUF_BLK_ENTRIES];
iowrite32(fetch_index, &rq->ctrl->posted_index); }
void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset)
{
u32 fetch_index;
rq->buf_index = 0; /* Use current fetch_index as the ring starting point */
fetch_index = ioread32(&rq->ctrl->fetch_index);
vnic_rq_init_start(rq, cq_index,
fetch_index, fetch_index,
error_interrupt_enable,
error_interrupt_offset);
} }
unsigned int vnic_rq_error_status(struct vnic_rq *rq) unsigned int vnic_rq_error_status(struct vnic_rq *rq)
...@@ -192,8 +203,6 @@ void vnic_rq_clean(struct vnic_rq *rq, ...@@ -192,8 +203,6 @@ void vnic_rq_clean(struct vnic_rq *rq,
[fetch_index % VNIC_RQ_BUF_BLK_ENTRIES]; [fetch_index % VNIC_RQ_BUF_BLK_ENTRIES];
iowrite32(fetch_index, &rq->ctrl->posted_index); iowrite32(fetch_index, &rq->ctrl->posted_index);
rq->buf_index = 0;
vnic_dev_clear_desc_ring(&rq->ring); vnic_dev_clear_desc_ring(&rq->ring);
} }
/* /*
* Copyright 2008 Cisco Systems, Inc. All rights reserved. * Copyright 2008, 2009 Cisco Systems, Inc. All rights reserved.
* Copyright 2007 Nuova Systems, Inc. All rights reserved. * Copyright 2007 Nuova Systems, Inc. All rights reserved.
* *
* This program is free software; you may redistribute it and/or modify * This program is free software; you may redistribute it and/or modify
...@@ -79,7 +79,6 @@ struct vnic_rq { ...@@ -79,7 +79,6 @@ struct vnic_rq {
struct vnic_rq_buf *to_use; struct vnic_rq_buf *to_use;
struct vnic_rq_buf *to_clean; struct vnic_rq_buf *to_clean;
void *os_buf_head; void *os_buf_head;
unsigned int buf_index;
unsigned int pkts_outstanding; unsigned int pkts_outstanding;
}; };
...@@ -105,11 +104,6 @@ static inline unsigned int vnic_rq_next_index(struct vnic_rq *rq) ...@@ -105,11 +104,6 @@ static inline unsigned int vnic_rq_next_index(struct vnic_rq *rq)
return rq->to_use->index; return rq->to_use->index;
} }
static inline unsigned int vnic_rq_next_buf_index(struct vnic_rq *rq)
{
return rq->buf_index++;
}
static inline void vnic_rq_post(struct vnic_rq *rq, static inline void vnic_rq_post(struct vnic_rq *rq,
void *os_buf, unsigned int os_buf_index, void *os_buf, unsigned int os_buf_index,
dma_addr_t dma_addr, unsigned int len) dma_addr_t dma_addr, unsigned int len)
...@@ -204,6 +198,10 @@ static inline int vnic_rq_fill(struct vnic_rq *rq, ...@@ -204,6 +198,10 @@ static inline int vnic_rq_fill(struct vnic_rq *rq,
void vnic_rq_free(struct vnic_rq *rq); void vnic_rq_free(struct vnic_rq *rq);
int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index, int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index,
unsigned int desc_count, unsigned int desc_size); unsigned int desc_count, unsigned int desc_size);
void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
unsigned int fetch_index, unsigned int posted_index,
unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset);
void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index, void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
unsigned int error_interrupt_enable, unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset); unsigned int error_interrupt_offset);
......
...@@ -112,7 +112,8 @@ int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index, ...@@ -112,7 +112,8 @@ int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
return 0; return 0;
} }
void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index, void vnic_wq_init_start(struct vnic_wq *wq, unsigned int cq_index,
unsigned int fetch_index, unsigned int posted_index,
unsigned int error_interrupt_enable, unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset) unsigned int error_interrupt_offset)
{ {
...@@ -121,12 +122,25 @@ void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index, ...@@ -121,12 +122,25 @@ void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index,
paddr = (u64)wq->ring.base_addr | VNIC_PADDR_TARGET; paddr = (u64)wq->ring.base_addr | VNIC_PADDR_TARGET;
writeq(paddr, &wq->ctrl->ring_base); writeq(paddr, &wq->ctrl->ring_base);
iowrite32(wq->ring.desc_count, &wq->ctrl->ring_size); iowrite32(wq->ring.desc_count, &wq->ctrl->ring_size);
iowrite32(0, &wq->ctrl->fetch_index); iowrite32(fetch_index, &wq->ctrl->fetch_index);
iowrite32(0, &wq->ctrl->posted_index); iowrite32(posted_index, &wq->ctrl->posted_index);
iowrite32(cq_index, &wq->ctrl->cq_index); iowrite32(cq_index, &wq->ctrl->cq_index);
iowrite32(error_interrupt_enable, &wq->ctrl->error_interrupt_enable); iowrite32(error_interrupt_enable, &wq->ctrl->error_interrupt_enable);
iowrite32(error_interrupt_offset, &wq->ctrl->error_interrupt_offset); iowrite32(error_interrupt_offset, &wq->ctrl->error_interrupt_offset);
iowrite32(0, &wq->ctrl->error_status); iowrite32(0, &wq->ctrl->error_status);
wq->to_use = wq->to_clean =
&wq->bufs[fetch_index / VNIC_WQ_BUF_BLK_ENTRIES]
[fetch_index % VNIC_WQ_BUF_BLK_ENTRIES];
}
void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index,
unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset)
{
vnic_wq_init_start(wq, cq_index, 0, 0,
error_interrupt_enable,
error_interrupt_offset);
} }
unsigned int vnic_wq_error_status(struct vnic_wq *wq) unsigned int vnic_wq_error_status(struct vnic_wq *wq)
......
...@@ -149,6 +149,10 @@ static inline void vnic_wq_service(struct vnic_wq *wq, ...@@ -149,6 +149,10 @@ static inline void vnic_wq_service(struct vnic_wq *wq,
void vnic_wq_free(struct vnic_wq *wq); void vnic_wq_free(struct vnic_wq *wq);
int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index, int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index,
unsigned int desc_count, unsigned int desc_size); unsigned int desc_count, unsigned int desc_size);
void vnic_wq_init_start(struct vnic_wq *wq, unsigned int cq_index,
unsigned int fetch_index, unsigned int posted_index,
unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset);
void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index, void vnic_wq_init(struct vnic_wq *wq, unsigned int cq_index,
unsigned int error_interrupt_enable, unsigned int error_interrupt_enable,
unsigned int error_interrupt_offset); unsigned int error_interrupt_offset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment