diff for duplicates of <20080612222311.GY30916@linux.vnet.ibm.com> diff --git a/a/1.txt b/N1/1.txt index 44acfaa..618c74b 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,4 +1,4 @@ -=46rom: Robert Jennings <rcj@linux.vnet.ibm.com> +From: Robert Jennings <rcj@linux.vnet.ibm.com> Enable ibmveth for Cooperative Memory Overcommitment (CMO). For this driver it means calculating a desired amount of IO memory based on the current MTU @@ -9,8 +9,7 @@ the driver can not map IO memory for the buffer pool. The following changes are made to enable the driver for CMO: * DMA mapping errors will not result in error messages if entitlement has been exceeded and resources were not available. - * DMA mapping errors are handled gracefully, ibmveth_replenish_buffer_pool= -() + * DMA mapping errors are handled gracefully, ibmveth_replenish_buffer_pool() is corrected to check the return from dma_map_single and fail gracefully. * The driver will have a get_io_entitlement function defined to function in a CMO environment. @@ -22,20 +21,17 @@ Signed-off-by: Santiago Leon <santil@us.ibm.com> --- - drivers/net/ibmveth.c | 169 ++++++++++++++++++++++++++++++++++++++++-----= ------ + drivers/net/ibmveth.c | 169 ++++++++++++++++++++++++++++++++++++++++---------- drivers/net/ibmveth.h | 5 + 2 files changed, 140 insertions(+), 34 deletions(-) Index: b/drivers/net/ibmveth.c -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +=================================================================== --- a/drivers/net/ibmveth.c +++ b/drivers/net/ibmveth.c @@ -33,6 +33,7 @@ */ -=20 + #include <linux/module.h> +#include <linux/moduleparam.h> #include <linux/types.h> @@ -49,62 +45,60 @@ Index: b/drivers/net/ibmveth.c #include <asm/uaccess.h> +#include <asm/firmware.h> #include <linux/seq_file.h> -=20 + #include "ibmveth.h" @@ -94,8 +97,10 @@ static void ibmveth_proc_register_adapte - static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapte= -r); + static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter); static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance); static void ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter); +static unsigned long ibmveth_get_io_entitlement(struct vio_dev *vdev); static struct kobj_type ktype_veth_pool; -=20 + + #ifdef CONFIG_PROC_FS #define IBMVETH_PROC_DIR "ibmveth" static struct proc_dir_entry *ibmveth_proc_dir; @@ -226,16 +231,16 @@ static void ibmveth_replenish_buffer_poo u32 i; - u32 count =3D pool->size - atomic_read(&pool->available); - u32 buffers_added =3D 0; + u32 count = pool->size - atomic_read(&pool->available); + u32 buffers_added = 0; + struct sk_buff *skb; + unsigned int free_index, index; + u64 correlator; + unsigned long lpar_rc; + dma_addr_t dma_addr; -=20 + mb(); -=20 - for(i =3D 0; i < count; ++i) { + + for(i = 0; i < count; ++i) { - struct sk_buff *skb; - unsigned int free_index, index; - u64 correlator; union ibmveth_buf_desc desc; - unsigned long lpar_rc; - dma_addr_t dma_addr; -=20 - skb =3D alloc_skb(pool->buff_size, GFP_ATOMIC); -=20 + + skb = alloc_skb(pool->buff_size, GFP_ATOMIC); + @@ -255,6 +260,9 @@ static void ibmveth_replenish_buffer_poo - dma_addr =3D dma_map_single(&adapter->vdev->dev, skb->data, + dma_addr = dma_map_single(&adapter->vdev->dev, skb->data, pool->buff_size, DMA_FROM_DEVICE); -=20 + + if (dma_mapping_error(dma_addr)) + goto failure; + - pool->free_map[free_index] =3D IBM_VETH_INVALID_MAP; - pool->dma_addr[index] =3D dma_addr; - pool->skbuff[index] =3D skb; + pool->free_map[free_index] = IBM_VETH_INVALID_MAP; + pool->dma_addr[index] = dma_addr; + pool->skbuff[index] = skb; @@ -267,20 +275,9 @@ static void ibmveth_replenish_buffer_poo -=20 - lpar_rc =3D h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.d= -esc); -=20 -- if(lpar_rc !=3D H_SUCCESS) { -- pool->free_map[free_index] =3D index; -- pool->skbuff[index] =3D NULL; -- if (pool->consumer_index =3D=3D 0) -- pool->consumer_index =3D pool->size - 1; + + lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); + +- if(lpar_rc != H_SUCCESS) { +- pool->free_map[free_index] = index; +- pool->skbuff[index] = NULL; +- if (pool->consumer_index == 0) +- pool->consumer_index = pool->size - 1; - else - pool->consumer_index--; - dma_unmap_single(&adapter->vdev->dev, @@ -114,23 +108,23 @@ esc); - adapter->replenish_add_buff_failure++; - break; - } else { -+ if (lpar_rc !=3D H_SUCCESS) ++ if (lpar_rc != H_SUCCESS) + goto failure; + else { buffers_added++; adapter->replenish_add_buff_success++; } @@ -288,6 +285,24 @@ static void ibmveth_replenish_buffer_poo -=20 + mb(); atomic_add(buffers_added, &(pool->available)); + return; + +failure: -+ pool->free_map[free_index] =3D index; -+ pool->skbuff[index] =3D NULL; -+ if (pool->consumer_index =3D=3D 0) -+ pool->consumer_index =3D pool->size - 1; ++ pool->free_map[free_index] = index; ++ pool->skbuff[index] = NULL; ++ if (pool->consumer_index == 0) ++ pool->consumer_index = pool->size - 1; + else + pool->consumer_index--; + if (!dma_mapping_error(dma_addr)) @@ -143,14 +137,14 @@ esc); + mb(); + atomic_add(buffers_added, &(pool->available)); } -=20 + /* replenish routine */ @@ -297,7 +312,7 @@ static void ibmveth_replenish_task(struc -=20 + adapter->replenish_task_cycles++; -=20 -- for(i =3D 0; i < IbmVethNumBufferPools; i++) -+ for (i =3D (IbmVethNumBufferPools - 1); i >=3D 0; i--) + +- for(i = 0; i < IbmVethNumBufferPools; i++) ++ for (i = (IbmVethNumBufferPools - 1); i >= 0; i--) if(adapter->rx_buff_pool[i].active) ibmveth_replenish_buffer_pool(adapter, &adapter->rx_buff_pool[i]); @@ -159,25 +153,25 @@ esc); ibmveth_free_buffer_pool(adapter, &adapter->rx_buff_pool[i]); + -+ if(adapter->bounce_buffer !=3D NULL) { ++ if(adapter->bounce_buffer != NULL) { + if(!dma_mapping_error(adapter->bounce_buffer_dma)) { + dma_unmap_single(&adapter->vdev->dev, + adapter->bounce_buffer_dma, + adapter->netdev->mtu + IBMVETH_BUFF_OH, + DMA_BIDIRECTIONAL); -+ adapter->bounce_buffer_dma =3D DMA_ERROR_CODE; ++ adapter->bounce_buffer_dma = DMA_ERROR_CODE; + } + kfree(adapter->bounce_buffer); -+ adapter->bounce_buffer =3D NULL; ++ adapter->bounce_buffer = NULL; + } } -=20 + static int ibmveth_register_logical_lan(struct ibmveth_adapter *adapter, @@ -607,6 +634,24 @@ static int ibmveth_open(struct net_devic return rc; } -=20 -+ adapter->bounce_buffer =3D + ++ adapter->bounce_buffer = + kmalloc(netdev->mtu + IBMVETH_BUFF_OH, GFP_KERNEL); + if(!adapter->bounce_buffer) { + ibmveth_error_printk("unable to allocate bounce buffer\n"); @@ -185,7 +179,7 @@ esc); + napi_disable(&adapter->napi); + return -ENOMEM; + } -+ adapter->bounce_buffer_dma =3D ++ adapter->bounce_buffer_dma = + dma_map_single(&adapter->vdev->dev, adapter->bounce_buffer, + netdev->mtu + IBMVETH_BUFF_OH, DMA_BIDIRECTIONAL); + if(dma_mapping_error(adapter->bounce_buffer_dma)) { @@ -197,26 +191,26 @@ esc); + ibmveth_debug_printk("initial replenish cycle\n"); ibmveth_interrupt(netdev->irq, netdev); -=20 + @@ -853,10 +898,12 @@ static int ibmveth_start_xmit(struct sk_ - unsigned int tx_packets =3D 0; - unsigned int tx_send_failed =3D 0; - unsigned int tx_map_failed =3D 0; -+ int used_bounce =3D 0; + unsigned int tx_packets = 0; + unsigned int tx_send_failed = 0; + unsigned int tx_map_failed = 0; ++ int used_bounce = 0; + unsigned long data_dma_addr; -=20 - desc.fields.flags_len =3D IBMVETH_BUF_VALID | skb->len; -- desc.fields.address =3D dma_map_single(&adapter->vdev->dev, skb->data, + + desc.fields.flags_len = IBMVETH_BUF_VALID | skb->len; +- desc.fields.address = dma_map_single(&adapter->vdev->dev, skb->data, - skb->len, DMA_TO_DEVICE); -+ data_dma_addr =3D dma_map_single(&adapter->vdev->dev, skb->data, ++ data_dma_addr = dma_map_single(&adapter->vdev->dev, skb->data, + skb->len, DMA_TO_DEVICE); -=20 - if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && - ip_hdr(skb)->protocol !=3D IPPROTO_TCP && skb_checksum_help(skb)) { + + if (skb->ip_summed == CHECKSUM_PARTIAL && + ip_hdr(skb)->protocol != IPPROTO_TCP && skb_checksum_help(skb)) { @@ -875,12 +922,16 @@ static int ibmveth_start_xmit(struct sk_ - buf[1] =3D 0; + buf[1] = 0; } -=20 + - if (dma_mapping_error(desc.fields.address)) { - ibmveth_error_printk("tx: unable to map xmit buffer\n"); + if (dma_mapping_error(data_dma_addr)) { @@ -224,54 +218,54 @@ esc); + ibmveth_error_printk("tx: unable to map xmit buffer\n"); + skb_copy_from_linear_data(skb, adapter->bounce_buffer, + skb->len); -+ desc.fields.address =3D adapter->bounce_buffer_dma; ++ desc.fields.address = adapter->bounce_buffer_dma; tx_map_failed++; - tx_dropped++; - goto out; - } -+ used_bounce =3D 1; ++ used_bounce = 1; + } else -+ desc.fields.address =3D data_dma_addr; -=20 ++ desc.fields.address = data_dma_addr; + /* send the frame. Arbitrarily set retrycount to 1024 */ - correlator =3D 0; + correlator = 0; @@ -904,8 +955,9 @@ static int ibmveth_start_xmit(struct sk_ - netdev->trans_start =3D jiffies; + netdev->trans_start = jiffies; } -=20 + - dma_unmap_single(&adapter->vdev->dev, desc.fields.address, - skb->len, DMA_TO_DEVICE); + if (!used_bounce) + dma_unmap_single(&adapter->vdev->dev, data_dma_addr, + skb->len, DMA_TO_DEVICE); -=20 + out: spin_lock_irqsave(&adapter->stats_lock, flags); - netdev->stats.tx_dropped +=3D tx_dropped; + netdev->stats.tx_dropped += tx_dropped; @@ -1053,8 +1105,9 @@ static void ibmveth_set_multicast_list(s static int ibmveth_change_mtu(struct net_device *dev, int new_mtu) { - struct ibmveth_adapter *adapter =3D dev->priv; -+ struct vio_dev *viodev =3D adapter->vdev; - int new_mtu_oh =3D new_mtu + IBMVETH_BUFF_OH; + struct ibmveth_adapter *adapter = dev->priv; ++ struct vio_dev *viodev = adapter->vdev; + int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; - int i, rc; + int i; -=20 + if (new_mtu < IBMVETH_MAX_MTU) return -EINVAL; @@ -1085,10 +1138,15 @@ static int ibmveth_change_mtu(struct net ibmveth_close(adapter->netdev); - adapter->pool_config =3D 0; - dev->mtu =3D new_mtu; -- if ((rc =3D ibmveth_open(adapter->netdev))) + adapter->pool_config = 0; + dev->mtu = new_mtu; +- if ((rc = ibmveth_open(adapter->netdev))) - return rc; - } else -- dev->mtu =3D new_mtu; +- dev->mtu = new_mtu; + vio_cmo_set_dev_desired(viodev, + ibmveth_get_io_entitlement + (viodev)); + return ibmveth_open(adapter->netdev); + } -+ dev->mtu =3D new_mtu; ++ dev->mtu = new_mtu; + vio_cmo_set_dev_desired(viodev, + ibmveth_get_io_entitlement + (viodev)); @@ -281,10 +275,9 @@ esc); @@ -1103,6 +1161,46 @@ static void ibmveth_poll_controller(stru } #endif -=20 + +/** -+ * ibmveth_get_io_entitlement - Calculate IO entitlement needed by the dri= -ver ++ * ibmveth_get_io_entitlement - Calculate IO entitlement needed by the driver + * + * @vdev: struct vio_dev for the device whose entitlement is to be returned + * @@ -293,85 +286,79 @@ ver + */ +static unsigned long ibmveth_get_io_entitlement(struct vio_dev *vdev) +{ -+ struct net_device *netdev =3D dev_get_drvdata(&vdev->dev); ++ struct net_device *netdev = dev_get_drvdata(&vdev->dev); + struct ibmveth_adapter *adapter; + unsigned long ret; + int i; -+ int rxqentries =3D 1; ++ int rxqentries = 1; + + /* netdev inits at probe time along with the structures we need below*/ -+ if (netdev =3D=3D NULL) ++ if (netdev == NULL) + return IOMMU_PAGE_ALIGN(IBMVETH_IO_ENTITLEMENT_DEFAULT); + -+ adapter =3D netdev_priv(netdev); ++ adapter = netdev_priv(netdev); + -+ ret =3D IBMVETH_BUFF_LIST_SIZE + IBMVETH_FILT_LIST_SIZE; -+ ret +=3D IOMMU_PAGE_ALIGN(netdev->mtu); ++ ret = IBMVETH_BUFF_LIST_SIZE + IBMVETH_FILT_LIST_SIZE; ++ ret += IOMMU_PAGE_ALIGN(netdev->mtu); + -+ for (i =3D 0; i < IbmVethNumBufferPools; i++) { ++ for (i = 0; i < IbmVethNumBufferPools; i++) { + /* add the size of the active receive buffers */ + if (adapter->rx_buff_pool[i].active) -+ ret +=3D ++ ret += + adapter->rx_buff_pool[i].size * + IOMMU_PAGE_ALIGN(adapter->rx_buff_pool[i]. + buff_size); -+ rxqentries +=3D adapter->rx_buff_pool[i].size; ++ rxqentries += adapter->rx_buff_pool[i].size; + } + /* add the size of the receive queue entries */ -+ ret +=3D IOMMU_PAGE_ALIGN(rxqentries * sizeof(struct ibmveth_rx_q_entry)); ++ ret += IOMMU_PAGE_ALIGN(rxqentries * sizeof(struct ibmveth_rx_q_entry)); + + return ret; +} + - static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_d= -evice_id *id) + static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) { int rc, i; @@ -1247,6 +1345,8 @@ static int __devexit ibmveth_remove(stru ibmveth_proc_unregister_adapter(adapter); -=20 + free_netdev(netdev); + dev_set_drvdata(&dev->dev, NULL); + return 0; } -=20 -@@ -1491,6 +1591,7 @@ static struct vio_driver ibmveth_driver=20 - .id_table =3D ibmveth_device_table, - .probe =3D ibmveth_probe, - .remove =3D ibmveth_remove, -+ .get_io_entitlement =3D ibmveth_get_io_entitlement, - .driver =3D { - .name =3D ibmveth_driver_name, - .owner =3D THIS_MODULE, + +@@ -1491,6 +1591,7 @@ static struct vio_driver ibmveth_driver + .id_table = ibmveth_device_table, + .probe = ibmveth_probe, + .remove = ibmveth_remove, ++ .get_io_entitlement = ibmveth_get_io_entitlement, + .driver = { + .name = ibmveth_driver_name, + .owner = THIS_MODULE, Index: b/drivers/net/ibmveth.h -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +=================================================================== --- a/drivers/net/ibmveth.h +++ b/drivers/net/ibmveth.h @@ -93,9 +93,12 @@ static inline long h_illan_attributes(un plpar_hcall_norets(H_CHANGE_LOGICAL_LAN_MAC, ua, mac) -=20 + #define IbmVethNumBufferPools 5 -+#define IBMVETH_IO_ENTITLEMENT_DEFAULT 4243456 /* MTU of 1500 needs 4.2Mb = -*/ - #define IBMVETH_BUFF_OH 22 /* Overhead: 14 ethernet header + 8 opaque hand= -le */ ++#define IBMVETH_IO_ENTITLEMENT_DEFAULT 4243456 /* MTU of 1500 needs 4.2Mb */ + #define IBMVETH_BUFF_OH 22 /* Overhead: 14 ethernet header + 8 opaque handle */ #define IBMVETH_MAX_MTU 68 #define IBMVETH_MAX_POOL_COUNT 4096 +#define IBMVETH_BUFF_LIST_SIZE 4096 +#define IBMVETH_FILT_LIST_SIZE 4096 #define IBMVETH_MAX_BUF_SIZE (1024 * 128) -=20 - static int pool_size[] =3D { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 6= -4 }; + + static int pool_size[] = { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 64 }; @@ -143,6 +146,8 @@ struct ibmveth_adapter { struct ibmveth_rx_q rx_queue; int pool_config; int rx_csum; + void * bounce_buffer; + dma_addr_t bounce_buffer_dma; -=20 + /* adapter specific stats */ u64 replenish_task_cycles; diff --git a/a/content_digest b/N1/content_digest index e5312c2..3dde228 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -3,13 +3,15 @@ "Subject\0[PATCH 17/19] ibmveth: enable driver for CMO\0" "Date\0Thu, 12 Jun 2008 17:23:11 -0500\0" "To\0paulus@samba.org\0" - "Cc\0netdev@vger.kernel.org" - linuxppc-dev@ozlabs.org - David Darrington <ddarring@linux.vnet.ibm.com> - " Brian King <brking@linux.vnet.ibm.com>\0" + "Cc\0linuxppc-dev@ozlabs.org" + netdev@vger.kernel.org + Brian King <brking@linux.vnet.ibm.com> + Santiago Leon <santil@us.ibm.com> + Nathan Fontenot <nfont@austin.ibm.com> + " David Darrington <ddarring@linux.vnet.ibm.com>\0" "\00:1\0" "b\0" - "=46rom: Robert Jennings <rcj@linux.vnet.ibm.com>\n" + "From: Robert Jennings <rcj@linux.vnet.ibm.com>\n" "\n" "Enable ibmveth for Cooperative Memory Overcommitment (CMO). For this driver\n" "it means calculating a desired amount of IO memory based on the current MTU\n" @@ -20,8 +22,7 @@ "The following changes are made to enable the driver for CMO:\n" " * DMA mapping errors will not result in error messages if entitlement has\n" " been exceeded and resources were not available.\n" - " * DMA mapping errors are handled gracefully, ibmveth_replenish_buffer_pool=\n" - "()\n" + " * DMA mapping errors are handled gracefully, ibmveth_replenish_buffer_pool()\n" " is corrected to check the return from dma_map_single and fail gracefully.\n" " * The driver will have a get_io_entitlement function defined to function\n" " in a CMO environment.\n" @@ -33,20 +34,17 @@ "\n" "---\n" "\n" - " drivers/net/ibmveth.c | 169 ++++++++++++++++++++++++++++++++++++++++-----=\n" - "-----\n" + " drivers/net/ibmveth.c | 169 ++++++++++++++++++++++++++++++++++++++++----------\n" " drivers/net/ibmveth.h | 5 +\n" " 2 files changed, 140 insertions(+), 34 deletions(-)\n" "\n" "Index: b/drivers/net/ibmveth.c\n" - "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=\n" - "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=\n" - "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n" + "===================================================================\n" "--- a/drivers/net/ibmveth.c\n" "+++ b/drivers/net/ibmveth.c\n" "@@ -33,6 +33,7 @@\n" " */\n" - "=20\n" + " \n" " #include <linux/module.h>\n" "+#include <linux/moduleparam.h>\n" " #include <linux/types.h>\n" @@ -60,62 +58,60 @@ " #include <asm/uaccess.h>\n" "+#include <asm/firmware.h>\n" " #include <linux/seq_file.h>\n" - "=20\n" + " \n" " #include \"ibmveth.h\"\n" "@@ -94,8 +97,10 @@ static void ibmveth_proc_register_adapte\n" - " static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapte=\n" - "r);\n" + " static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter);\n" " static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance);\n" " static void ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter);\n" "+static unsigned long ibmveth_get_io_entitlement(struct vio_dev *vdev);\n" " static struct kobj_type ktype_veth_pool;\n" - "=20\n" + " \n" "+\n" " #ifdef CONFIG_PROC_FS\n" " #define IBMVETH_PROC_DIR \"ibmveth\"\n" " static struct proc_dir_entry *ibmveth_proc_dir;\n" "@@ -226,16 +231,16 @@ static void ibmveth_replenish_buffer_poo\n" " \tu32 i;\n" - " \tu32 count =3D pool->size - atomic_read(&pool->available);\n" - " \tu32 buffers_added =3D 0;\n" + " \tu32 count = pool->size - atomic_read(&pool->available);\n" + " \tu32 buffers_added = 0;\n" "+\tstruct sk_buff *skb;\n" "+\tunsigned int free_index, index;\n" "+\tu64 correlator;\n" "+\tunsigned long lpar_rc;\n" "+\tdma_addr_t dma_addr;\n" - "=20\n" + " \n" " \tmb();\n" - "=20\n" - " \tfor(i =3D 0; i < count; ++i) {\n" + " \n" + " \tfor(i = 0; i < count; ++i) {\n" "-\t\tstruct sk_buff *skb;\n" "-\t\tunsigned int free_index, index;\n" "-\t\tu64 correlator;\n" " \t\tunion ibmveth_buf_desc desc;\n" "-\t\tunsigned long lpar_rc;\n" "-\t\tdma_addr_t dma_addr;\n" - "=20\n" - " \t\tskb =3D alloc_skb(pool->buff_size, GFP_ATOMIC);\n" - "=20\n" + " \n" + " \t\tskb = alloc_skb(pool->buff_size, GFP_ATOMIC);\n" + " \n" "@@ -255,6 +260,9 @@ static void ibmveth_replenish_buffer_poo\n" - " \t\tdma_addr =3D dma_map_single(&adapter->vdev->dev, skb->data,\n" + " \t\tdma_addr = dma_map_single(&adapter->vdev->dev, skb->data,\n" " \t\t\t\tpool->buff_size, DMA_FROM_DEVICE);\n" - "=20\n" + " \n" "+\t\tif (dma_mapping_error(dma_addr))\n" "+\t\t\tgoto failure;\n" "+\n" - " \t\tpool->free_map[free_index] =3D IBM_VETH_INVALID_MAP;\n" - " \t\tpool->dma_addr[index] =3D dma_addr;\n" - " \t\tpool->skbuff[index] =3D skb;\n" + " \t\tpool->free_map[free_index] = IBM_VETH_INVALID_MAP;\n" + " \t\tpool->dma_addr[index] = dma_addr;\n" + " \t\tpool->skbuff[index] = skb;\n" "@@ -267,20 +275,9 @@ static void ibmveth_replenish_buffer_poo\n" - "=20\n" - " \t\tlpar_rc =3D h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.d=\n" - "esc);\n" - "=20\n" - "-\t\tif(lpar_rc !=3D H_SUCCESS) {\n" - "-\t\t\tpool->free_map[free_index] =3D index;\n" - "-\t\t\tpool->skbuff[index] =3D NULL;\n" - "-\t\t\tif (pool->consumer_index =3D=3D 0)\n" - "-\t\t\t\tpool->consumer_index =3D pool->size - 1;\n" + " \n" + " \t\tlpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc);\n" + " \n" + "-\t\tif(lpar_rc != H_SUCCESS) {\n" + "-\t\t\tpool->free_map[free_index] = index;\n" + "-\t\t\tpool->skbuff[index] = NULL;\n" + "-\t\t\tif (pool->consumer_index == 0)\n" + "-\t\t\t\tpool->consumer_index = pool->size - 1;\n" "-\t\t\telse\n" "-\t\t\t\tpool->consumer_index--;\n" "-\t\t\tdma_unmap_single(&adapter->vdev->dev,\n" @@ -125,23 +121,23 @@ "-\t\t\tadapter->replenish_add_buff_failure++;\n" "-\t\t\tbreak;\n" "-\t\t} else {\n" - "+\t\tif (lpar_rc !=3D H_SUCCESS)\n" + "+\t\tif (lpar_rc != H_SUCCESS)\n" "+\t\t\tgoto failure;\n" "+\t\telse {\n" " \t\t\tbuffers_added++;\n" " \t\t\tadapter->replenish_add_buff_success++;\n" " \t\t}\n" "@@ -288,6 +285,24 @@ static void ibmveth_replenish_buffer_poo\n" - "=20\n" + " \n" " \tmb();\n" " \tatomic_add(buffers_added, &(pool->available));\n" "+\treturn;\n" "+\n" "+failure:\n" - "+\tpool->free_map[free_index] =3D index;\n" - "+\tpool->skbuff[index] =3D NULL;\n" - "+\tif (pool->consumer_index =3D=3D 0)\n" - "+\t\tpool->consumer_index =3D pool->size - 1;\n" + "+\tpool->free_map[free_index] = index;\n" + "+\tpool->skbuff[index] = NULL;\n" + "+\tif (pool->consumer_index == 0)\n" + "+\t\tpool->consumer_index = pool->size - 1;\n" "+\telse\n" "+\t\tpool->consumer_index--;\n" "+\tif (!dma_mapping_error(dma_addr))\n" @@ -154,14 +150,14 @@ "+\tmb();\n" "+\tatomic_add(buffers_added, &(pool->available));\n" " }\n" - "=20\n" + " \n" " /* replenish routine */\n" "@@ -297,7 +312,7 @@ static void ibmveth_replenish_task(struc\n" - "=20\n" + " \n" " \tadapter->replenish_task_cycles++;\n" - "=20\n" - "-\tfor(i =3D 0; i < IbmVethNumBufferPools; i++)\n" - "+\tfor (i =3D (IbmVethNumBufferPools - 1); i >=3D 0; i--)\n" + " \n" + "-\tfor(i = 0; i < IbmVethNumBufferPools; i++)\n" + "+\tfor (i = (IbmVethNumBufferPools - 1); i >= 0; i--)\n" " \t\tif(adapter->rx_buff_pool[i].active)\n" " \t\t\tibmveth_replenish_buffer_pool(adapter,\n" " \t\t\t\t\t\t &adapter->rx_buff_pool[i]);\n" @@ -170,25 +166,25 @@ " \t\t\tibmveth_free_buffer_pool(adapter,\n" " \t\t\t\t\t\t &adapter->rx_buff_pool[i]);\n" "+\n" - "+\tif(adapter->bounce_buffer !=3D NULL) {\n" + "+\tif(adapter->bounce_buffer != NULL) {\n" "+\t\tif(!dma_mapping_error(adapter->bounce_buffer_dma)) {\n" "+\t\t\tdma_unmap_single(&adapter->vdev->dev,\n" "+\t\t\t\t\tadapter->bounce_buffer_dma,\n" "+\t\t\t\t\tadapter->netdev->mtu + IBMVETH_BUFF_OH,\n" "+\t\t\t\t\tDMA_BIDIRECTIONAL);\n" - "+\t\t\tadapter->bounce_buffer_dma =3D DMA_ERROR_CODE;\n" + "+\t\t\tadapter->bounce_buffer_dma = DMA_ERROR_CODE;\n" "+\t\t}\n" "+\t\tkfree(adapter->bounce_buffer);\n" - "+\t\tadapter->bounce_buffer =3D NULL;\n" + "+\t\tadapter->bounce_buffer = NULL;\n" "+\t}\n" " }\n" - "=20\n" + " \n" " static int ibmveth_register_logical_lan(struct ibmveth_adapter *adapter,\n" "@@ -607,6 +634,24 @@ static int ibmveth_open(struct net_devic\n" " \t\treturn rc;\n" " \t}\n" - "=20\n" - "+\tadapter->bounce_buffer =3D\n" + " \n" + "+\tadapter->bounce_buffer =\n" "+\t kmalloc(netdev->mtu + IBMVETH_BUFF_OH, GFP_KERNEL);\n" "+\tif(!adapter->bounce_buffer) {\n" "+\t\tibmveth_error_printk(\"unable to allocate bounce buffer\\n\");\n" @@ -196,7 +192,7 @@ "+\t\tnapi_disable(&adapter->napi);\n" "+\t\treturn -ENOMEM;\n" "+\t}\n" - "+\tadapter->bounce_buffer_dma =3D\n" + "+\tadapter->bounce_buffer_dma =\n" "+\t dma_map_single(&adapter->vdev->dev, adapter->bounce_buffer,\n" "+\t\t\t netdev->mtu + IBMVETH_BUFF_OH, DMA_BIDIRECTIONAL);\n" "+\tif(dma_mapping_error(adapter->bounce_buffer_dma)) {\n" @@ -208,26 +204,26 @@ "+\n" " \tibmveth_debug_printk(\"initial replenish cycle\\n\");\n" " \tibmveth_interrupt(netdev->irq, netdev);\n" - "=20\n" + " \n" "@@ -853,10 +898,12 @@ static int ibmveth_start_xmit(struct sk_\n" - " \tunsigned int tx_packets =3D 0;\n" - " \tunsigned int tx_send_failed =3D 0;\n" - " \tunsigned int tx_map_failed =3D 0;\n" - "+\tint used_bounce =3D 0;\n" + " \tunsigned int tx_packets = 0;\n" + " \tunsigned int tx_send_failed = 0;\n" + " \tunsigned int tx_map_failed = 0;\n" + "+\tint used_bounce = 0;\n" "+\tunsigned long data_dma_addr;\n" - "=20\n" - " \tdesc.fields.flags_len =3D IBMVETH_BUF_VALID | skb->len;\n" - "-\tdesc.fields.address =3D dma_map_single(&adapter->vdev->dev, skb->data,\n" + " \n" + " \tdesc.fields.flags_len = IBMVETH_BUF_VALID | skb->len;\n" + "-\tdesc.fields.address = dma_map_single(&adapter->vdev->dev, skb->data,\n" "-\t\t\t\t\t skb->len, DMA_TO_DEVICE);\n" - "+\tdata_dma_addr =3D dma_map_single(&adapter->vdev->dev, skb->data,\n" + "+\tdata_dma_addr = dma_map_single(&adapter->vdev->dev, skb->data,\n" "+\t\t\t\t skb->len, DMA_TO_DEVICE);\n" - "=20\n" - " \tif (skb->ip_summed =3D=3D CHECKSUM_PARTIAL &&\n" - " \t ip_hdr(skb)->protocol !=3D IPPROTO_TCP && skb_checksum_help(skb)) {\n" + " \n" + " \tif (skb->ip_summed == CHECKSUM_PARTIAL &&\n" + " \t ip_hdr(skb)->protocol != IPPROTO_TCP && skb_checksum_help(skb)) {\n" "@@ -875,12 +922,16 @@ static int ibmveth_start_xmit(struct sk_\n" - " \t\tbuf[1] =3D 0;\n" + " \t\tbuf[1] = 0;\n" " \t}\n" - "=20\n" + " \n" "-\tif (dma_mapping_error(desc.fields.address)) {\n" "-\t\tibmveth_error_printk(\"tx: unable to map xmit buffer\\n\");\n" "+\tif (dma_mapping_error(data_dma_addr)) {\n" @@ -235,54 +231,54 @@ "+\t\t\tibmveth_error_printk(\"tx: unable to map xmit buffer\\n\");\n" "+\t\tskb_copy_from_linear_data(skb, adapter->bounce_buffer,\n" "+\t\t\t\t\t skb->len);\n" - "+\t\tdesc.fields.address =3D adapter->bounce_buffer_dma;\n" + "+\t\tdesc.fields.address = adapter->bounce_buffer_dma;\n" " \t\ttx_map_failed++;\n" "-\t\ttx_dropped++;\n" "-\t\tgoto out;\n" "-\t}\n" - "+\t\tused_bounce =3D 1;\n" + "+\t\tused_bounce = 1;\n" "+\t} else\n" - "+\t\tdesc.fields.address =3D data_dma_addr;\n" - "=20\n" + "+\t\tdesc.fields.address = data_dma_addr;\n" + " \n" " \t/* send the frame. Arbitrarily set retrycount to 1024 */\n" - " \tcorrelator =3D 0;\n" + " \tcorrelator = 0;\n" "@@ -904,8 +955,9 @@ static int ibmveth_start_xmit(struct sk_\n" - " \t\tnetdev->trans_start =3D jiffies;\n" + " \t\tnetdev->trans_start = jiffies;\n" " \t}\n" - "=20\n" + " \n" "-\tdma_unmap_single(&adapter->vdev->dev, desc.fields.address,\n" "-\t\t\t skb->len, DMA_TO_DEVICE);\n" "+\tif (!used_bounce)\n" "+\t\tdma_unmap_single(&adapter->vdev->dev, data_dma_addr,\n" "+\t\t\t\t skb->len, DMA_TO_DEVICE);\n" - "=20\n" + " \n" " out:\tspin_lock_irqsave(&adapter->stats_lock, flags);\n" - " \tnetdev->stats.tx_dropped +=3D tx_dropped;\n" + " \tnetdev->stats.tx_dropped += tx_dropped;\n" "@@ -1053,8 +1105,9 @@ static void ibmveth_set_multicast_list(s\n" " static int ibmveth_change_mtu(struct net_device *dev, int new_mtu)\n" " {\n" - " \tstruct ibmveth_adapter *adapter =3D dev->priv;\n" - "+\tstruct vio_dev *viodev =3D adapter->vdev;\n" - " \tint new_mtu_oh =3D new_mtu + IBMVETH_BUFF_OH;\n" + " \tstruct ibmveth_adapter *adapter = dev->priv;\n" + "+\tstruct vio_dev *viodev = adapter->vdev;\n" + " \tint new_mtu_oh = new_mtu + IBMVETH_BUFF_OH;\n" "-\tint i, rc;\n" "+\tint i;\n" - "=20\n" + " \n" " \tif (new_mtu < IBMVETH_MAX_MTU)\n" " \t\treturn -EINVAL;\n" "@@ -1085,10 +1138,15 @@ static int ibmveth_change_mtu(struct net\n" " \t\t\t\tibmveth_close(adapter->netdev);\n" - " \t\t\t\tadapter->pool_config =3D 0;\n" - " \t\t\t\tdev->mtu =3D new_mtu;\n" - "-\t\t\t\tif ((rc =3D ibmveth_open(adapter->netdev)))\n" + " \t\t\t\tadapter->pool_config = 0;\n" + " \t\t\t\tdev->mtu = new_mtu;\n" + "-\t\t\t\tif ((rc = ibmveth_open(adapter->netdev)))\n" "-\t\t\t\t\treturn rc;\n" "-\t\t\t} else\n" - "-\t\t\t\tdev->mtu =3D new_mtu;\n" + "-\t\t\t\tdev->mtu = new_mtu;\n" "+\t\t\t\tvio_cmo_set_dev_desired(viodev,\n" "+\t\t\t\t\t\tibmveth_get_io_entitlement\n" "+\t\t\t\t\t\t(viodev));\n" "+\t\t\t\treturn ibmveth_open(adapter->netdev);\n" "+\t\t\t}\n" - "+\t\t\tdev->mtu =3D new_mtu;\n" + "+\t\t\tdev->mtu = new_mtu;\n" "+\t\t\tvio_cmo_set_dev_desired(viodev,\n" "+\t\t\t\t\t\tibmveth_get_io_entitlement\n" "+\t\t\t\t\t\t(viodev));\n" @@ -292,10 +288,9 @@ "@@ -1103,6 +1161,46 @@ static void ibmveth_poll_controller(stru\n" " }\n" " #endif\n" - "=20\n" + " \n" "+/**\n" - "+ * ibmveth_get_io_entitlement - Calculate IO entitlement needed by the dri=\n" - "ver\n" + "+ * ibmveth_get_io_entitlement - Calculate IO entitlement needed by the driver\n" "+ *\n" "+ * @vdev: struct vio_dev for the device whose entitlement is to be returned\n" "+ *\n" @@ -304,87 +299,81 @@ "+ */\n" "+static unsigned long ibmveth_get_io_entitlement(struct vio_dev *vdev)\n" "+{\n" - "+\tstruct net_device *netdev =3D dev_get_drvdata(&vdev->dev);\n" + "+\tstruct net_device *netdev = dev_get_drvdata(&vdev->dev);\n" "+\tstruct ibmveth_adapter *adapter;\n" "+\tunsigned long ret;\n" "+\tint i;\n" - "+\tint rxqentries =3D 1;\n" + "+\tint rxqentries = 1;\n" "+\n" "+\t/* netdev inits at probe time along with the structures we need below*/\n" - "+\tif (netdev =3D=3D NULL)\n" + "+\tif (netdev == NULL)\n" "+\t\treturn IOMMU_PAGE_ALIGN(IBMVETH_IO_ENTITLEMENT_DEFAULT);\n" "+\n" - "+\tadapter =3D netdev_priv(netdev);\n" + "+\tadapter = netdev_priv(netdev);\n" "+\n" - "+\tret =3D IBMVETH_BUFF_LIST_SIZE + IBMVETH_FILT_LIST_SIZE;\n" - "+\tret +=3D IOMMU_PAGE_ALIGN(netdev->mtu);\n" + "+\tret = IBMVETH_BUFF_LIST_SIZE + IBMVETH_FILT_LIST_SIZE;\n" + "+\tret += IOMMU_PAGE_ALIGN(netdev->mtu);\n" "+\n" - "+\tfor (i =3D 0; i < IbmVethNumBufferPools; i++) {\n" + "+\tfor (i = 0; i < IbmVethNumBufferPools; i++) {\n" "+\t\t/* add the size of the active receive buffers */\n" "+\t\tif (adapter->rx_buff_pool[i].active)\n" - "+\t\t\tret +=3D\n" + "+\t\t\tret +=\n" "+\t\t\t adapter->rx_buff_pool[i].size *\n" "+\t\t\t IOMMU_PAGE_ALIGN(adapter->rx_buff_pool[i].\n" "+\t\t\t buff_size);\n" - "+\t\trxqentries +=3D adapter->rx_buff_pool[i].size;\n" + "+\t\trxqentries += adapter->rx_buff_pool[i].size;\n" "+\t}\n" "+\t/* add the size of the receive queue entries */\n" - "+\tret +=3D IOMMU_PAGE_ALIGN(rxqentries * sizeof(struct ibmveth_rx_q_entry));\n" + "+\tret += IOMMU_PAGE_ALIGN(rxqentries * sizeof(struct ibmveth_rx_q_entry));\n" "+\n" "+\treturn ret;\n" "+}\n" "+\n" - " static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_d=\n" - "evice_id *id)\n" + " static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id)\n" " {\n" " \tint rc, i;\n" "@@ -1247,6 +1345,8 @@ static int __devexit ibmveth_remove(stru\n" " \tibmveth_proc_unregister_adapter(adapter);\n" - "=20\n" + " \n" " \tfree_netdev(netdev);\n" "+\tdev_set_drvdata(&dev->dev, NULL);\n" "+\n" " \treturn 0;\n" " }\n" - "=20\n" - "@@ -1491,6 +1591,7 @@ static struct vio_driver ibmveth_driver=20\n" - " \t.id_table\t=3D ibmveth_device_table,\n" - " \t.probe\t\t=3D ibmveth_probe,\n" - " \t.remove\t\t=3D ibmveth_remove,\n" - "+\t.get_io_entitlement =3D ibmveth_get_io_entitlement,\n" - " \t.driver\t\t=3D {\n" - " \t\t.name\t=3D ibmveth_driver_name,\n" - " \t\t.owner\t=3D THIS_MODULE,\n" + " \n" + "@@ -1491,6 +1591,7 @@ static struct vio_driver ibmveth_driver \n" + " \t.id_table\t= ibmveth_device_table,\n" + " \t.probe\t\t= ibmveth_probe,\n" + " \t.remove\t\t= ibmveth_remove,\n" + "+\t.get_io_entitlement = ibmveth_get_io_entitlement,\n" + " \t.driver\t\t= {\n" + " \t\t.name\t= ibmveth_driver_name,\n" + " \t\t.owner\t= THIS_MODULE,\n" "Index: b/drivers/net/ibmveth.h\n" - "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=\n" - "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=\n" - "=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D\n" + "===================================================================\n" "--- a/drivers/net/ibmveth.h\n" "+++ b/drivers/net/ibmveth.h\n" "@@ -93,9 +93,12 @@ static inline long h_illan_attributes(un\n" " plpar_hcall_norets(H_CHANGE_LOGICAL_LAN_MAC, ua, mac)\n" - "=20\n" + " \n" " #define IbmVethNumBufferPools 5\n" - "+#define IBMVETH_IO_ENTITLEMENT_DEFAULT 4243456 /* MTU of 1500 needs 4.2Mb =\n" - "*/\n" - " #define IBMVETH_BUFF_OH 22 /* Overhead: 14 ethernet header + 8 opaque hand=\n" - "le */\n" + "+#define IBMVETH_IO_ENTITLEMENT_DEFAULT 4243456 /* MTU of 1500 needs 4.2Mb */\n" + " #define IBMVETH_BUFF_OH 22 /* Overhead: 14 ethernet header + 8 opaque handle */\n" " #define IBMVETH_MAX_MTU 68\n" " #define IBMVETH_MAX_POOL_COUNT 4096\n" "+#define IBMVETH_BUFF_LIST_SIZE 4096\n" "+#define IBMVETH_FILT_LIST_SIZE 4096\n" " #define IBMVETH_MAX_BUF_SIZE (1024 * 128)\n" - "=20\n" - " static int pool_size[] =3D { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 6=\n" - "4 };\n" + " \n" + " static int pool_size[] = { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 64 };\n" "@@ -143,6 +146,8 @@ struct ibmveth_adapter {\n" " struct ibmveth_rx_q rx_queue;\n" " int pool_config;\n" " int rx_csum;\n" "+ void * bounce_buffer;\n" "+ dma_addr_t bounce_buffer_dma;\n" - "=20\n" + " \n" " /* adapter specific stats */\n" u64 replenish_task_cycles; -4659897f870a7ef1ca5f1304dc96c89448a4357d644c0ea15da7ef9042c8eebc +a7bd06d8662e0cd6fef1bb91b1ccb1c478ba3a455112ca8a06a082bc863c73ea
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.