Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.30-rc7 1618 lines 48 kB view raw
1/**************************************************************************/ 2/* */ 3/* IBM eServer i/pSeries Virtual Ethernet Device Driver */ 4/* Copyright (C) 2003 IBM Corp. */ 5/* Originally written by Dave Larson (larson1@us.ibm.com) */ 6/* Maintained by Santiago Leon (santil@us.ibm.com) */ 7/* */ 8/* This program is free software; you can redistribute it and/or modify */ 9/* it under the terms of the GNU General Public License as published by */ 10/* the Free Software Foundation; either version 2 of the License, or */ 11/* (at your option) any later version. */ 12/* */ 13/* This program is distributed in the hope that it will be useful, */ 14/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ 15/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ 16/* GNU General Public License for more details. */ 17/* */ 18/* You should have received a copy of the GNU General Public License */ 19/* along with this program; if not, write to the Free Software */ 20/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 */ 21/* USA */ 22/* */ 23/* This module contains the implementation of a virtual ethernet device */ 24/* for use with IBM i/pSeries LPAR Linux. It utilizes the logical LAN */ 25/* option of the RS/6000 Platform Architechture to interface with virtual */ 26/* ethernet NICs that are presented to the partition by the hypervisor. */ 27/* */ 28/**************************************************************************/ 29/* 30 TODO: 31 - add support for sysfs 32 - possibly remove procfs support 33*/ 34 35#include <linux/module.h> 36#include <linux/moduleparam.h> 37#include <linux/types.h> 38#include <linux/errno.h> 39#include <linux/ioport.h> 40#include <linux/dma-mapping.h> 41#include <linux/kernel.h> 42#include <linux/netdevice.h> 43#include <linux/etherdevice.h> 44#include <linux/skbuff.h> 45#include <linux/init.h> 46#include <linux/delay.h> 47#include <linux/mm.h> 48#include <linux/ethtool.h> 49#include <linux/proc_fs.h> 50#include <linux/in.h> 51#include <linux/ip.h> 52#include <net/net_namespace.h> 53#include <asm/hvcall.h> 54#include <asm/atomic.h> 55#include <asm/vio.h> 56#include <asm/iommu.h> 57#include <asm/uaccess.h> 58#include <asm/firmware.h> 59#include <linux/seq_file.h> 60 61#include "ibmveth.h" 62 63#undef DEBUG 64 65#define ibmveth_printk(fmt, args...) \ 66 printk(KERN_DEBUG "%s: " fmt, __FILE__, ## args) 67 68#define ibmveth_error_printk(fmt, args...) \ 69 printk(KERN_ERR "(%s:%3.3d ua:%x) ERROR: " fmt, __FILE__, __LINE__ , adapter->vdev->unit_address, ## args) 70 71#ifdef DEBUG 72#define ibmveth_debug_printk_no_adapter(fmt, args...) \ 73 printk(KERN_DEBUG "(%s:%3.3d): " fmt, __FILE__, __LINE__ , ## args) 74#define ibmveth_debug_printk(fmt, args...) \ 75 printk(KERN_DEBUG "(%s:%3.3d ua:%x): " fmt, __FILE__, __LINE__ , adapter->vdev->unit_address, ## args) 76#define ibmveth_assert(expr) \ 77 if(!(expr)) { \ 78 printk(KERN_DEBUG "assertion failed (%s:%3.3d ua:%x): %s\n", __FILE__, __LINE__, adapter->vdev->unit_address, #expr); \ 79 BUG(); \ 80 } 81#else 82#define ibmveth_debug_printk_no_adapter(fmt, args...) 83#define ibmveth_debug_printk(fmt, args...) 84#define ibmveth_assert(expr) 85#endif 86 87static int ibmveth_open(struct net_device *dev); 88static int ibmveth_close(struct net_device *dev); 89static int ibmveth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); 90static int ibmveth_poll(struct napi_struct *napi, int budget); 91static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *dev); 92static void ibmveth_set_multicast_list(struct net_device *dev); 93static int ibmveth_change_mtu(struct net_device *dev, int new_mtu); 94static void ibmveth_proc_register_driver(void); 95static void ibmveth_proc_unregister_driver(void); 96static void ibmveth_proc_register_adapter(struct ibmveth_adapter *adapter); 97static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter); 98static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance); 99static void ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter); 100static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev); 101static struct kobj_type ktype_veth_pool; 102 103 104#ifdef CONFIG_PROC_FS 105#define IBMVETH_PROC_DIR "ibmveth" 106static struct proc_dir_entry *ibmveth_proc_dir; 107#endif 108 109static const char ibmveth_driver_name[] = "ibmveth"; 110static const char ibmveth_driver_string[] = "IBM i/pSeries Virtual Ethernet Driver"; 111#define ibmveth_driver_version "1.03" 112 113MODULE_AUTHOR("Santiago Leon <santil@us.ibm.com>"); 114MODULE_DESCRIPTION("IBM i/pSeries Virtual Ethernet Driver"); 115MODULE_LICENSE("GPL"); 116MODULE_VERSION(ibmveth_driver_version); 117 118struct ibmveth_stat { 119 char name[ETH_GSTRING_LEN]; 120 int offset; 121}; 122 123#define IBMVETH_STAT_OFF(stat) offsetof(struct ibmveth_adapter, stat) 124#define IBMVETH_GET_STAT(a, off) *((u64 *)(((unsigned long)(a)) + off)) 125 126struct ibmveth_stat ibmveth_stats[] = { 127 { "replenish_task_cycles", IBMVETH_STAT_OFF(replenish_task_cycles) }, 128 { "replenish_no_mem", IBMVETH_STAT_OFF(replenish_no_mem) }, 129 { "replenish_add_buff_failure", IBMVETH_STAT_OFF(replenish_add_buff_failure) }, 130 { "replenish_add_buff_success", IBMVETH_STAT_OFF(replenish_add_buff_success) }, 131 { "rx_invalid_buffer", IBMVETH_STAT_OFF(rx_invalid_buffer) }, 132 { "rx_no_buffer", IBMVETH_STAT_OFF(rx_no_buffer) }, 133 { "tx_map_failed", IBMVETH_STAT_OFF(tx_map_failed) }, 134 { "tx_send_failed", IBMVETH_STAT_OFF(tx_send_failed) }, 135}; 136 137/* simple methods of getting data from the current rxq entry */ 138static inline u32 ibmveth_rxq_flags(struct ibmveth_adapter *adapter) 139{ 140 return adapter->rx_queue.queue_addr[adapter->rx_queue.index].flags_off; 141} 142 143static inline int ibmveth_rxq_toggle(struct ibmveth_adapter *adapter) 144{ 145 return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_TOGGLE) >> IBMVETH_RXQ_TOGGLE_SHIFT; 146} 147 148static inline int ibmveth_rxq_pending_buffer(struct ibmveth_adapter *adapter) 149{ 150 return (ibmveth_rxq_toggle(adapter) == adapter->rx_queue.toggle); 151} 152 153static inline int ibmveth_rxq_buffer_valid(struct ibmveth_adapter *adapter) 154{ 155 return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_VALID); 156} 157 158static inline int ibmveth_rxq_frame_offset(struct ibmveth_adapter *adapter) 159{ 160 return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_OFF_MASK); 161} 162 163static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter) 164{ 165 return (adapter->rx_queue.queue_addr[adapter->rx_queue.index].length); 166} 167 168static inline int ibmveth_rxq_csum_good(struct ibmveth_adapter *adapter) 169{ 170 return (ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_CSUM_GOOD); 171} 172 173/* setup the initial settings for a buffer pool */ 174static void ibmveth_init_buffer_pool(struct ibmveth_buff_pool *pool, u32 pool_index, u32 pool_size, u32 buff_size, u32 pool_active) 175{ 176 pool->size = pool_size; 177 pool->index = pool_index; 178 pool->buff_size = buff_size; 179 pool->threshold = pool_size / 2; 180 pool->active = pool_active; 181} 182 183/* allocate and setup an buffer pool - called during open */ 184static int ibmveth_alloc_buffer_pool(struct ibmveth_buff_pool *pool) 185{ 186 int i; 187 188 pool->free_map = kmalloc(sizeof(u16) * pool->size, GFP_KERNEL); 189 190 if(!pool->free_map) { 191 return -1; 192 } 193 194 pool->dma_addr = kmalloc(sizeof(dma_addr_t) * pool->size, GFP_KERNEL); 195 if(!pool->dma_addr) { 196 kfree(pool->free_map); 197 pool->free_map = NULL; 198 return -1; 199 } 200 201 pool->skbuff = kmalloc(sizeof(void*) * pool->size, GFP_KERNEL); 202 203 if(!pool->skbuff) { 204 kfree(pool->dma_addr); 205 pool->dma_addr = NULL; 206 207 kfree(pool->free_map); 208 pool->free_map = NULL; 209 return -1; 210 } 211 212 memset(pool->skbuff, 0, sizeof(void*) * pool->size); 213 memset(pool->dma_addr, 0, sizeof(dma_addr_t) * pool->size); 214 215 for(i = 0; i < pool->size; ++i) { 216 pool->free_map[i] = i; 217 } 218 219 atomic_set(&pool->available, 0); 220 pool->producer_index = 0; 221 pool->consumer_index = 0; 222 223 return 0; 224} 225 226/* replenish the buffers for a pool. note that we don't need to 227 * skb_reserve these since they are used for incoming... 228 */ 229static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, struct ibmveth_buff_pool *pool) 230{ 231 u32 i; 232 u32 count = pool->size - atomic_read(&pool->available); 233 u32 buffers_added = 0; 234 struct sk_buff *skb; 235 unsigned int free_index, index; 236 u64 correlator; 237 unsigned long lpar_rc; 238 dma_addr_t dma_addr; 239 240 mb(); 241 242 for(i = 0; i < count; ++i) { 243 union ibmveth_buf_desc desc; 244 245 skb = alloc_skb(pool->buff_size, GFP_ATOMIC); 246 247 if(!skb) { 248 ibmveth_debug_printk("replenish: unable to allocate skb\n"); 249 adapter->replenish_no_mem++; 250 break; 251 } 252 253 free_index = pool->consumer_index; 254 pool->consumer_index = (pool->consumer_index + 1) % pool->size; 255 index = pool->free_map[free_index]; 256 257 ibmveth_assert(index != IBM_VETH_INVALID_MAP); 258 ibmveth_assert(pool->skbuff[index] == NULL); 259 260 dma_addr = dma_map_single(&adapter->vdev->dev, skb->data, 261 pool->buff_size, DMA_FROM_DEVICE); 262 263 if (dma_mapping_error(&adapter->vdev->dev, dma_addr)) 264 goto failure; 265 266 pool->free_map[free_index] = IBM_VETH_INVALID_MAP; 267 pool->dma_addr[index] = dma_addr; 268 pool->skbuff[index] = skb; 269 270 correlator = ((u64)pool->index << 32) | index; 271 *(u64*)skb->data = correlator; 272 273 desc.fields.flags_len = IBMVETH_BUF_VALID | pool->buff_size; 274 desc.fields.address = dma_addr; 275 276 lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); 277 278 if (lpar_rc != H_SUCCESS) 279 goto failure; 280 else { 281 buffers_added++; 282 adapter->replenish_add_buff_success++; 283 } 284 } 285 286 mb(); 287 atomic_add(buffers_added, &(pool->available)); 288 return; 289 290failure: 291 pool->free_map[free_index] = index; 292 pool->skbuff[index] = NULL; 293 if (pool->consumer_index == 0) 294 pool->consumer_index = pool->size - 1; 295 else 296 pool->consumer_index--; 297 if (!dma_mapping_error(&adapter->vdev->dev, dma_addr)) 298 dma_unmap_single(&adapter->vdev->dev, 299 pool->dma_addr[index], pool->buff_size, 300 DMA_FROM_DEVICE); 301 dev_kfree_skb_any(skb); 302 adapter->replenish_add_buff_failure++; 303 304 mb(); 305 atomic_add(buffers_added, &(pool->available)); 306} 307 308/* replenish routine */ 309static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) 310{ 311 int i; 312 313 adapter->replenish_task_cycles++; 314 315 for (i = (IbmVethNumBufferPools - 1); i >= 0; i--) 316 if(adapter->rx_buff_pool[i].active) 317 ibmveth_replenish_buffer_pool(adapter, 318 &adapter->rx_buff_pool[i]); 319 320 adapter->rx_no_buffer = *(u64*)(((char*)adapter->buffer_list_addr) + 4096 - 8); 321} 322 323/* empty and free ana buffer pool - also used to do cleanup in error paths */ 324static void ibmveth_free_buffer_pool(struct ibmveth_adapter *adapter, struct ibmveth_buff_pool *pool) 325{ 326 int i; 327 328 kfree(pool->free_map); 329 pool->free_map = NULL; 330 331 if(pool->skbuff && pool->dma_addr) { 332 for(i = 0; i < pool->size; ++i) { 333 struct sk_buff *skb = pool->skbuff[i]; 334 if(skb) { 335 dma_unmap_single(&adapter->vdev->dev, 336 pool->dma_addr[i], 337 pool->buff_size, 338 DMA_FROM_DEVICE); 339 dev_kfree_skb_any(skb); 340 pool->skbuff[i] = NULL; 341 } 342 } 343 } 344 345 if(pool->dma_addr) { 346 kfree(pool->dma_addr); 347 pool->dma_addr = NULL; 348 } 349 350 if(pool->skbuff) { 351 kfree(pool->skbuff); 352 pool->skbuff = NULL; 353 } 354} 355 356/* remove a buffer from a pool */ 357static void ibmveth_remove_buffer_from_pool(struct ibmveth_adapter *adapter, u64 correlator) 358{ 359 unsigned int pool = correlator >> 32; 360 unsigned int index = correlator & 0xffffffffUL; 361 unsigned int free_index; 362 struct sk_buff *skb; 363 364 ibmveth_assert(pool < IbmVethNumBufferPools); 365 ibmveth_assert(index < adapter->rx_buff_pool[pool].size); 366 367 skb = adapter->rx_buff_pool[pool].skbuff[index]; 368 369 ibmveth_assert(skb != NULL); 370 371 adapter->rx_buff_pool[pool].skbuff[index] = NULL; 372 373 dma_unmap_single(&adapter->vdev->dev, 374 adapter->rx_buff_pool[pool].dma_addr[index], 375 adapter->rx_buff_pool[pool].buff_size, 376 DMA_FROM_DEVICE); 377 378 free_index = adapter->rx_buff_pool[pool].producer_index; 379 adapter->rx_buff_pool[pool].producer_index 380 = (adapter->rx_buff_pool[pool].producer_index + 1) 381 % adapter->rx_buff_pool[pool].size; 382 adapter->rx_buff_pool[pool].free_map[free_index] = index; 383 384 mb(); 385 386 atomic_dec(&(adapter->rx_buff_pool[pool].available)); 387} 388 389/* get the current buffer on the rx queue */ 390static inline struct sk_buff *ibmveth_rxq_get_buffer(struct ibmveth_adapter *adapter) 391{ 392 u64 correlator = adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator; 393 unsigned int pool = correlator >> 32; 394 unsigned int index = correlator & 0xffffffffUL; 395 396 ibmveth_assert(pool < IbmVethNumBufferPools); 397 ibmveth_assert(index < adapter->rx_buff_pool[pool].size); 398 399 return adapter->rx_buff_pool[pool].skbuff[index]; 400} 401 402/* recycle the current buffer on the rx queue */ 403static void ibmveth_rxq_recycle_buffer(struct ibmveth_adapter *adapter) 404{ 405 u32 q_index = adapter->rx_queue.index; 406 u64 correlator = adapter->rx_queue.queue_addr[q_index].correlator; 407 unsigned int pool = correlator >> 32; 408 unsigned int index = correlator & 0xffffffffUL; 409 union ibmveth_buf_desc desc; 410 unsigned long lpar_rc; 411 412 ibmveth_assert(pool < IbmVethNumBufferPools); 413 ibmveth_assert(index < adapter->rx_buff_pool[pool].size); 414 415 if(!adapter->rx_buff_pool[pool].active) { 416 ibmveth_rxq_harvest_buffer(adapter); 417 ibmveth_free_buffer_pool(adapter, &adapter->rx_buff_pool[pool]); 418 return; 419 } 420 421 desc.fields.flags_len = IBMVETH_BUF_VALID | 422 adapter->rx_buff_pool[pool].buff_size; 423 desc.fields.address = adapter->rx_buff_pool[pool].dma_addr[index]; 424 425 lpar_rc = h_add_logical_lan_buffer(adapter->vdev->unit_address, desc.desc); 426 427 if(lpar_rc != H_SUCCESS) { 428 ibmveth_debug_printk("h_add_logical_lan_buffer failed during recycle rc=%ld", lpar_rc); 429 ibmveth_remove_buffer_from_pool(adapter, adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator); 430 } 431 432 if(++adapter->rx_queue.index == adapter->rx_queue.num_slots) { 433 adapter->rx_queue.index = 0; 434 adapter->rx_queue.toggle = !adapter->rx_queue.toggle; 435 } 436} 437 438static void ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter) 439{ 440 ibmveth_remove_buffer_from_pool(adapter, adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator); 441 442 if(++adapter->rx_queue.index == adapter->rx_queue.num_slots) { 443 adapter->rx_queue.index = 0; 444 adapter->rx_queue.toggle = !adapter->rx_queue.toggle; 445 } 446} 447 448static void ibmveth_cleanup(struct ibmveth_adapter *adapter) 449{ 450 int i; 451 struct device *dev = &adapter->vdev->dev; 452 453 if(adapter->buffer_list_addr != NULL) { 454 if (!dma_mapping_error(dev, adapter->buffer_list_dma)) { 455 dma_unmap_single(dev, adapter->buffer_list_dma, 4096, 456 DMA_BIDIRECTIONAL); 457 adapter->buffer_list_dma = DMA_ERROR_CODE; 458 } 459 free_page((unsigned long)adapter->buffer_list_addr); 460 adapter->buffer_list_addr = NULL; 461 } 462 463 if(adapter->filter_list_addr != NULL) { 464 if (!dma_mapping_error(dev, adapter->filter_list_dma)) { 465 dma_unmap_single(dev, adapter->filter_list_dma, 4096, 466 DMA_BIDIRECTIONAL); 467 adapter->filter_list_dma = DMA_ERROR_CODE; 468 } 469 free_page((unsigned long)adapter->filter_list_addr); 470 adapter->filter_list_addr = NULL; 471 } 472 473 if(adapter->rx_queue.queue_addr != NULL) { 474 if (!dma_mapping_error(dev, adapter->rx_queue.queue_dma)) { 475 dma_unmap_single(dev, 476 adapter->rx_queue.queue_dma, 477 adapter->rx_queue.queue_len, 478 DMA_BIDIRECTIONAL); 479 adapter->rx_queue.queue_dma = DMA_ERROR_CODE; 480 } 481 kfree(adapter->rx_queue.queue_addr); 482 adapter->rx_queue.queue_addr = NULL; 483 } 484 485 for(i = 0; i<IbmVethNumBufferPools; i++) 486 if (adapter->rx_buff_pool[i].active) 487 ibmveth_free_buffer_pool(adapter, 488 &adapter->rx_buff_pool[i]); 489 490 if (adapter->bounce_buffer != NULL) { 491 if (!dma_mapping_error(dev, adapter->bounce_buffer_dma)) { 492 dma_unmap_single(&adapter->vdev->dev, 493 adapter->bounce_buffer_dma, 494 adapter->netdev->mtu + IBMVETH_BUFF_OH, 495 DMA_BIDIRECTIONAL); 496 adapter->bounce_buffer_dma = DMA_ERROR_CODE; 497 } 498 kfree(adapter->bounce_buffer); 499 adapter->bounce_buffer = NULL; 500 } 501} 502 503static int ibmveth_register_logical_lan(struct ibmveth_adapter *adapter, 504 union ibmveth_buf_desc rxq_desc, u64 mac_address) 505{ 506 int rc, try_again = 1; 507 508 /* After a kexec the adapter will still be open, so our attempt to 509 * open it will fail. So if we get a failure we free the adapter and 510 * try again, but only once. */ 511retry: 512 rc = h_register_logical_lan(adapter->vdev->unit_address, 513 adapter->buffer_list_dma, rxq_desc.desc, 514 adapter->filter_list_dma, mac_address); 515 516 if (rc != H_SUCCESS && try_again) { 517 do { 518 rc = h_free_logical_lan(adapter->vdev->unit_address); 519 } while (H_IS_LONG_BUSY(rc) || (rc == H_BUSY)); 520 521 try_again = 0; 522 goto retry; 523 } 524 525 return rc; 526} 527 528static int ibmveth_open(struct net_device *netdev) 529{ 530 struct ibmveth_adapter *adapter = netdev_priv(netdev); 531 u64 mac_address = 0; 532 int rxq_entries = 1; 533 unsigned long lpar_rc; 534 int rc; 535 union ibmveth_buf_desc rxq_desc; 536 int i; 537 struct device *dev; 538 539 ibmveth_debug_printk("open starting\n"); 540 541 napi_enable(&adapter->napi); 542 543 for(i = 0; i<IbmVethNumBufferPools; i++) 544 rxq_entries += adapter->rx_buff_pool[i].size; 545 546 adapter->buffer_list_addr = (void*) get_zeroed_page(GFP_KERNEL); 547 adapter->filter_list_addr = (void*) get_zeroed_page(GFP_KERNEL); 548 549 if(!adapter->buffer_list_addr || !adapter->filter_list_addr) { 550 ibmveth_error_printk("unable to allocate filter or buffer list pages\n"); 551 ibmveth_cleanup(adapter); 552 napi_disable(&adapter->napi); 553 return -ENOMEM; 554 } 555 556 adapter->rx_queue.queue_len = sizeof(struct ibmveth_rx_q_entry) * rxq_entries; 557 adapter->rx_queue.queue_addr = kmalloc(adapter->rx_queue.queue_len, GFP_KERNEL); 558 559 if(!adapter->rx_queue.queue_addr) { 560 ibmveth_error_printk("unable to allocate rx queue pages\n"); 561 ibmveth_cleanup(adapter); 562 napi_disable(&adapter->napi); 563 return -ENOMEM; 564 } 565 566 dev = &adapter->vdev->dev; 567 568 adapter->buffer_list_dma = dma_map_single(dev, 569 adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL); 570 adapter->filter_list_dma = dma_map_single(dev, 571 adapter->filter_list_addr, 4096, DMA_BIDIRECTIONAL); 572 adapter->rx_queue.queue_dma = dma_map_single(dev, 573 adapter->rx_queue.queue_addr, 574 adapter->rx_queue.queue_len, DMA_BIDIRECTIONAL); 575 576 if ((dma_mapping_error(dev, adapter->buffer_list_dma)) || 577 (dma_mapping_error(dev, adapter->filter_list_dma)) || 578 (dma_mapping_error(dev, adapter->rx_queue.queue_dma))) { 579 ibmveth_error_printk("unable to map filter or buffer list pages\n"); 580 ibmveth_cleanup(adapter); 581 napi_disable(&adapter->napi); 582 return -ENOMEM; 583 } 584 585 adapter->rx_queue.index = 0; 586 adapter->rx_queue.num_slots = rxq_entries; 587 adapter->rx_queue.toggle = 1; 588 589 memcpy(&mac_address, netdev->dev_addr, netdev->addr_len); 590 mac_address = mac_address >> 16; 591 592 rxq_desc.fields.flags_len = IBMVETH_BUF_VALID | adapter->rx_queue.queue_len; 593 rxq_desc.fields.address = adapter->rx_queue.queue_dma; 594 595 ibmveth_debug_printk("buffer list @ 0x%p\n", adapter->buffer_list_addr); 596 ibmveth_debug_printk("filter list @ 0x%p\n", adapter->filter_list_addr); 597 ibmveth_debug_printk("receive q @ 0x%p\n", adapter->rx_queue.queue_addr); 598 599 h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); 600 601 lpar_rc = ibmveth_register_logical_lan(adapter, rxq_desc, mac_address); 602 603 if(lpar_rc != H_SUCCESS) { 604 ibmveth_error_printk("h_register_logical_lan failed with %ld\n", lpar_rc); 605 ibmveth_error_printk("buffer TCE:0x%llx filter TCE:0x%llx rxq desc:0x%llx MAC:0x%llx\n", 606 adapter->buffer_list_dma, 607 adapter->filter_list_dma, 608 rxq_desc.desc, 609 mac_address); 610 ibmveth_cleanup(adapter); 611 napi_disable(&adapter->napi); 612 return -ENONET; 613 } 614 615 for(i = 0; i<IbmVethNumBufferPools; i++) { 616 if(!adapter->rx_buff_pool[i].active) 617 continue; 618 if (ibmveth_alloc_buffer_pool(&adapter->rx_buff_pool[i])) { 619 ibmveth_error_printk("unable to alloc pool\n"); 620 adapter->rx_buff_pool[i].active = 0; 621 ibmveth_cleanup(adapter); 622 napi_disable(&adapter->napi); 623 return -ENOMEM ; 624 } 625 } 626 627 ibmveth_debug_printk("registering irq 0x%x\n", netdev->irq); 628 if((rc = request_irq(netdev->irq, &ibmveth_interrupt, 0, netdev->name, netdev)) != 0) { 629 ibmveth_error_printk("unable to request irq 0x%x, rc %d\n", netdev->irq, rc); 630 do { 631 rc = h_free_logical_lan(adapter->vdev->unit_address); 632 } while (H_IS_LONG_BUSY(rc) || (rc == H_BUSY)); 633 634 ibmveth_cleanup(adapter); 635 napi_disable(&adapter->napi); 636 return rc; 637 } 638 639 adapter->bounce_buffer = 640 kmalloc(netdev->mtu + IBMVETH_BUFF_OH, GFP_KERNEL); 641 if (!adapter->bounce_buffer) { 642 ibmveth_error_printk("unable to allocate bounce buffer\n"); 643 ibmveth_cleanup(adapter); 644 napi_disable(&adapter->napi); 645 return -ENOMEM; 646 } 647 adapter->bounce_buffer_dma = 648 dma_map_single(&adapter->vdev->dev, adapter->bounce_buffer, 649 netdev->mtu + IBMVETH_BUFF_OH, DMA_BIDIRECTIONAL); 650 if (dma_mapping_error(dev, adapter->bounce_buffer_dma)) { 651 ibmveth_error_printk("unable to map bounce buffer\n"); 652 ibmveth_cleanup(adapter); 653 napi_disable(&adapter->napi); 654 return -ENOMEM; 655 } 656 657 ibmveth_debug_printk("initial replenish cycle\n"); 658 ibmveth_interrupt(netdev->irq, netdev); 659 660 netif_start_queue(netdev); 661 662 ibmveth_debug_printk("open complete\n"); 663 664 return 0; 665} 666 667static int ibmveth_close(struct net_device *netdev) 668{ 669 struct ibmveth_adapter *adapter = netdev_priv(netdev); 670 long lpar_rc; 671 672 ibmveth_debug_printk("close starting\n"); 673 674 napi_disable(&adapter->napi); 675 676 if (!adapter->pool_config) 677 netif_stop_queue(netdev); 678 679 free_irq(netdev->irq, netdev); 680 681 do { 682 lpar_rc = h_free_logical_lan(adapter->vdev->unit_address); 683 } while (H_IS_LONG_BUSY(lpar_rc) || (lpar_rc == H_BUSY)); 684 685 if(lpar_rc != H_SUCCESS) 686 { 687 ibmveth_error_printk("h_free_logical_lan failed with %lx, continuing with close\n", 688 lpar_rc); 689 } 690 691 adapter->rx_no_buffer = *(u64*)(((char*)adapter->buffer_list_addr) + 4096 - 8); 692 693 ibmveth_cleanup(adapter); 694 695 ibmveth_debug_printk("close complete\n"); 696 697 return 0; 698} 699 700static int netdev_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) { 701 cmd->supported = (SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE); 702 cmd->advertising = (ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg | ADVERTISED_FIBRE); 703 cmd->speed = SPEED_1000; 704 cmd->duplex = DUPLEX_FULL; 705 cmd->port = PORT_FIBRE; 706 cmd->phy_address = 0; 707 cmd->transceiver = XCVR_INTERNAL; 708 cmd->autoneg = AUTONEG_ENABLE; 709 cmd->maxtxpkt = 0; 710 cmd->maxrxpkt = 1; 711 return 0; 712} 713 714static void netdev_get_drvinfo (struct net_device *dev, struct ethtool_drvinfo *info) { 715 strncpy(info->driver, ibmveth_driver_name, sizeof(info->driver) - 1); 716 strncpy(info->version, ibmveth_driver_version, sizeof(info->version) - 1); 717} 718 719static u32 netdev_get_link(struct net_device *dev) { 720 return 1; 721} 722 723static void ibmveth_set_rx_csum_flags(struct net_device *dev, u32 data) 724{ 725 struct ibmveth_adapter *adapter = netdev_priv(dev); 726 727 if (data) 728 adapter->rx_csum = 1; 729 else { 730 /* 731 * Since the ibmveth firmware interface does not have the concept of 732 * separate tx/rx checksum offload enable, if rx checksum is disabled 733 * we also have to disable tx checksum offload. Once we disable rx 734 * checksum offload, we are no longer allowed to send tx buffers that 735 * are not properly checksummed. 736 */ 737 adapter->rx_csum = 0; 738 dev->features &= ~NETIF_F_IP_CSUM; 739 } 740} 741 742static void ibmveth_set_tx_csum_flags(struct net_device *dev, u32 data) 743{ 744 struct ibmveth_adapter *adapter = netdev_priv(dev); 745 746 if (data) { 747 dev->features |= NETIF_F_IP_CSUM; 748 adapter->rx_csum = 1; 749 } else 750 dev->features &= ~NETIF_F_IP_CSUM; 751} 752 753static int ibmveth_set_csum_offload(struct net_device *dev, u32 data, 754 void (*done) (struct net_device *, u32)) 755{ 756 struct ibmveth_adapter *adapter = netdev_priv(dev); 757 unsigned long set_attr, clr_attr, ret_attr; 758 long ret; 759 int rc1 = 0, rc2 = 0; 760 int restart = 0; 761 762 if (netif_running(dev)) { 763 restart = 1; 764 adapter->pool_config = 1; 765 ibmveth_close(dev); 766 adapter->pool_config = 0; 767 } 768 769 set_attr = 0; 770 clr_attr = 0; 771 772 if (data) 773 set_attr = IBMVETH_ILLAN_IPV4_TCP_CSUM; 774 else 775 clr_attr = IBMVETH_ILLAN_IPV4_TCP_CSUM; 776 777 ret = h_illan_attributes(adapter->vdev->unit_address, 0, 0, &ret_attr); 778 779 if (ret == H_SUCCESS && !(ret_attr & IBMVETH_ILLAN_ACTIVE_TRUNK) && 780 !(ret_attr & IBMVETH_ILLAN_TRUNK_PRI_MASK) && 781 (ret_attr & IBMVETH_ILLAN_PADDED_PKT_CSUM)) { 782 ret = h_illan_attributes(adapter->vdev->unit_address, clr_attr, 783 set_attr, &ret_attr); 784 785 if (ret != H_SUCCESS) { 786 rc1 = -EIO; 787 ibmveth_error_printk("unable to change checksum offload settings." 788 " %d rc=%ld\n", data, ret); 789 790 ret = h_illan_attributes(adapter->vdev->unit_address, 791 set_attr, clr_attr, &ret_attr); 792 } else 793 done(dev, data); 794 } else { 795 rc1 = -EIO; 796 ibmveth_error_printk("unable to change checksum offload settings." 797 " %d rc=%ld ret_attr=%lx\n", data, ret, ret_attr); 798 } 799 800 if (restart) 801 rc2 = ibmveth_open(dev); 802 803 return rc1 ? rc1 : rc2; 804} 805 806static int ibmveth_set_rx_csum(struct net_device *dev, u32 data) 807{ 808 struct ibmveth_adapter *adapter = netdev_priv(dev); 809 810 if ((data && adapter->rx_csum) || (!data && !adapter->rx_csum)) 811 return 0; 812 813 return ibmveth_set_csum_offload(dev, data, ibmveth_set_rx_csum_flags); 814} 815 816static int ibmveth_set_tx_csum(struct net_device *dev, u32 data) 817{ 818 struct ibmveth_adapter *adapter = netdev_priv(dev); 819 int rc = 0; 820 821 if (data && (dev->features & NETIF_F_IP_CSUM)) 822 return 0; 823 if (!data && !(dev->features & NETIF_F_IP_CSUM)) 824 return 0; 825 826 if (data && !adapter->rx_csum) 827 rc = ibmveth_set_csum_offload(dev, data, ibmveth_set_tx_csum_flags); 828 else 829 ibmveth_set_tx_csum_flags(dev, data); 830 831 return rc; 832} 833 834static u32 ibmveth_get_rx_csum(struct net_device *dev) 835{ 836 struct ibmveth_adapter *adapter = netdev_priv(dev); 837 return adapter->rx_csum; 838} 839 840static void ibmveth_get_strings(struct net_device *dev, u32 stringset, u8 *data) 841{ 842 int i; 843 844 if (stringset != ETH_SS_STATS) 845 return; 846 847 for (i = 0; i < ARRAY_SIZE(ibmveth_stats); i++, data += ETH_GSTRING_LEN) 848 memcpy(data, ibmveth_stats[i].name, ETH_GSTRING_LEN); 849} 850 851static int ibmveth_get_sset_count(struct net_device *dev, int sset) 852{ 853 switch (sset) { 854 case ETH_SS_STATS: 855 return ARRAY_SIZE(ibmveth_stats); 856 default: 857 return -EOPNOTSUPP; 858 } 859} 860 861static void ibmveth_get_ethtool_stats(struct net_device *dev, 862 struct ethtool_stats *stats, u64 *data) 863{ 864 int i; 865 struct ibmveth_adapter *adapter = netdev_priv(dev); 866 867 for (i = 0; i < ARRAY_SIZE(ibmveth_stats); i++) 868 data[i] = IBMVETH_GET_STAT(adapter, ibmveth_stats[i].offset); 869} 870 871static const struct ethtool_ops netdev_ethtool_ops = { 872 .get_drvinfo = netdev_get_drvinfo, 873 .get_settings = netdev_get_settings, 874 .get_link = netdev_get_link, 875 .set_tx_csum = ibmveth_set_tx_csum, 876 .get_rx_csum = ibmveth_get_rx_csum, 877 .set_rx_csum = ibmveth_set_rx_csum, 878 .get_strings = ibmveth_get_strings, 879 .get_sset_count = ibmveth_get_sset_count, 880 .get_ethtool_stats = ibmveth_get_ethtool_stats, 881}; 882 883static int ibmveth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 884{ 885 return -EOPNOTSUPP; 886} 887 888#define page_offset(v) ((unsigned long)(v) & ((1 << 12) - 1)) 889 890static int ibmveth_start_xmit(struct sk_buff *skb, struct net_device *netdev) 891{ 892 struct ibmveth_adapter *adapter = netdev_priv(netdev); 893 union ibmveth_buf_desc desc; 894 unsigned long lpar_rc; 895 unsigned long correlator; 896 unsigned long flags; 897 unsigned int retry_count; 898 unsigned int tx_dropped = 0; 899 unsigned int tx_bytes = 0; 900 unsigned int tx_packets = 0; 901 unsigned int tx_send_failed = 0; 902 unsigned int tx_map_failed = 0; 903 int used_bounce = 0; 904 unsigned long data_dma_addr; 905 906 desc.fields.flags_len = IBMVETH_BUF_VALID | skb->len; 907 908 if (skb->ip_summed == CHECKSUM_PARTIAL && 909 ip_hdr(skb)->protocol != IPPROTO_TCP && skb_checksum_help(skb)) { 910 ibmveth_error_printk("tx: failed to checksum packet\n"); 911 tx_dropped++; 912 goto out; 913 } 914 915 if (skb->ip_summed == CHECKSUM_PARTIAL) { 916 unsigned char *buf = skb_transport_header(skb) + skb->csum_offset; 917 918 desc.fields.flags_len |= (IBMVETH_BUF_NO_CSUM | IBMVETH_BUF_CSUM_GOOD); 919 920 /* Need to zero out the checksum */ 921 buf[0] = 0; 922 buf[1] = 0; 923 } 924 925 data_dma_addr = dma_map_single(&adapter->vdev->dev, skb->data, 926 skb->len, DMA_TO_DEVICE); 927 if (dma_mapping_error(&adapter->vdev->dev, data_dma_addr)) { 928 if (!firmware_has_feature(FW_FEATURE_CMO)) 929 ibmveth_error_printk("tx: unable to map xmit buffer\n"); 930 skb_copy_from_linear_data(skb, adapter->bounce_buffer, 931 skb->len); 932 desc.fields.address = adapter->bounce_buffer_dma; 933 tx_map_failed++; 934 used_bounce = 1; 935 wmb(); 936 } else 937 desc.fields.address = data_dma_addr; 938 939 /* send the frame. Arbitrarily set retrycount to 1024 */ 940 correlator = 0; 941 retry_count = 1024; 942 do { 943 lpar_rc = h_send_logical_lan(adapter->vdev->unit_address, 944 desc.desc, 0, 0, 0, 0, 0, 945 correlator, &correlator); 946 } while ((lpar_rc == H_BUSY) && (retry_count--)); 947 948 if(lpar_rc != H_SUCCESS && lpar_rc != H_DROPPED) { 949 ibmveth_error_printk("tx: h_send_logical_lan failed with rc=%ld\n", lpar_rc); 950 ibmveth_error_printk("tx: valid=%d, len=%d, address=0x%08x\n", 951 (desc.fields.flags_len & IBMVETH_BUF_VALID) ? 1 : 0, 952 skb->len, desc.fields.address); 953 tx_send_failed++; 954 tx_dropped++; 955 } else { 956 tx_packets++; 957 tx_bytes += skb->len; 958 netdev->trans_start = jiffies; 959 } 960 961 if (!used_bounce) 962 dma_unmap_single(&adapter->vdev->dev, data_dma_addr, 963 skb->len, DMA_TO_DEVICE); 964 965out: spin_lock_irqsave(&adapter->stats_lock, flags); 966 netdev->stats.tx_dropped += tx_dropped; 967 netdev->stats.tx_bytes += tx_bytes; 968 netdev->stats.tx_packets += tx_packets; 969 adapter->tx_send_failed += tx_send_failed; 970 adapter->tx_map_failed += tx_map_failed; 971 spin_unlock_irqrestore(&adapter->stats_lock, flags); 972 973 dev_kfree_skb(skb); 974 return 0; 975} 976 977static int ibmveth_poll(struct napi_struct *napi, int budget) 978{ 979 struct ibmveth_adapter *adapter = container_of(napi, struct ibmveth_adapter, napi); 980 struct net_device *netdev = adapter->netdev; 981 int frames_processed = 0; 982 unsigned long lpar_rc; 983 984 restart_poll: 985 do { 986 struct sk_buff *skb; 987 988 if (!ibmveth_rxq_pending_buffer(adapter)) 989 break; 990 991 rmb(); 992 if (!ibmveth_rxq_buffer_valid(adapter)) { 993 wmb(); /* suggested by larson1 */ 994 adapter->rx_invalid_buffer++; 995 ibmveth_debug_printk("recycling invalid buffer\n"); 996 ibmveth_rxq_recycle_buffer(adapter); 997 } else { 998 int length = ibmveth_rxq_frame_length(adapter); 999 int offset = ibmveth_rxq_frame_offset(adapter); 1000 int csum_good = ibmveth_rxq_csum_good(adapter); 1001 1002 skb = ibmveth_rxq_get_buffer(adapter); 1003 if (csum_good) 1004 skb->ip_summed = CHECKSUM_UNNECESSARY; 1005 1006 ibmveth_rxq_harvest_buffer(adapter); 1007 1008 skb_reserve(skb, offset); 1009 skb_put(skb, length); 1010 skb->protocol = eth_type_trans(skb, netdev); 1011 1012 netif_receive_skb(skb); /* send it up */ 1013 1014 netdev->stats.rx_packets++; 1015 netdev->stats.rx_bytes += length; 1016 frames_processed++; 1017 } 1018 } while (frames_processed < budget); 1019 1020 ibmveth_replenish_task(adapter); 1021 1022 if (frames_processed < budget) { 1023 /* We think we are done - reenable interrupts, 1024 * then check once more to make sure we are done. 1025 */ 1026 lpar_rc = h_vio_signal(adapter->vdev->unit_address, 1027 VIO_IRQ_ENABLE); 1028 1029 ibmveth_assert(lpar_rc == H_SUCCESS); 1030 1031 napi_complete(napi); 1032 1033 if (ibmveth_rxq_pending_buffer(adapter) && 1034 napi_reschedule(napi)) { 1035 lpar_rc = h_vio_signal(adapter->vdev->unit_address, 1036 VIO_IRQ_DISABLE); 1037 goto restart_poll; 1038 } 1039 } 1040 1041 return frames_processed; 1042} 1043 1044static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance) 1045{ 1046 struct net_device *netdev = dev_instance; 1047 struct ibmveth_adapter *adapter = netdev_priv(netdev); 1048 unsigned long lpar_rc; 1049 1050 if (napi_schedule_prep(&adapter->napi)) { 1051 lpar_rc = h_vio_signal(adapter->vdev->unit_address, 1052 VIO_IRQ_DISABLE); 1053 ibmveth_assert(lpar_rc == H_SUCCESS); 1054 __napi_schedule(&adapter->napi); 1055 } 1056 return IRQ_HANDLED; 1057} 1058 1059static void ibmveth_set_multicast_list(struct net_device *netdev) 1060{ 1061 struct ibmveth_adapter *adapter = netdev_priv(netdev); 1062 unsigned long lpar_rc; 1063 1064 if((netdev->flags & IFF_PROMISC) || (netdev->mc_count > adapter->mcastFilterSize)) { 1065 lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, 1066 IbmVethMcastEnableRecv | 1067 IbmVethMcastDisableFiltering, 1068 0); 1069 if(lpar_rc != H_SUCCESS) { 1070 ibmveth_error_printk("h_multicast_ctrl rc=%ld when entering promisc mode\n", lpar_rc); 1071 } 1072 } else { 1073 struct dev_mc_list *mclist = netdev->mc_list; 1074 int i; 1075 /* clear the filter table & disable filtering */ 1076 lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, 1077 IbmVethMcastEnableRecv | 1078 IbmVethMcastDisableFiltering | 1079 IbmVethMcastClearFilterTable, 1080 0); 1081 if(lpar_rc != H_SUCCESS) { 1082 ibmveth_error_printk("h_multicast_ctrl rc=%ld when attempting to clear filter table\n", lpar_rc); 1083 } 1084 /* add the addresses to the filter table */ 1085 for(i = 0; i < netdev->mc_count; ++i, mclist = mclist->next) { 1086 // add the multicast address to the filter table 1087 unsigned long mcast_addr = 0; 1088 memcpy(((char *)&mcast_addr)+2, mclist->dmi_addr, 6); 1089 lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, 1090 IbmVethMcastAddFilter, 1091 mcast_addr); 1092 if(lpar_rc != H_SUCCESS) { 1093 ibmveth_error_printk("h_multicast_ctrl rc=%ld when adding an entry to the filter table\n", lpar_rc); 1094 } 1095 } 1096 1097 /* re-enable filtering */ 1098 lpar_rc = h_multicast_ctrl(adapter->vdev->unit_address, 1099 IbmVethMcastEnableFiltering, 1100 0); 1101 if(lpar_rc != H_SUCCESS) { 1102 ibmveth_error_printk("h_multicast_ctrl rc=%ld when enabling filtering\n", lpar_rc); 1103 } 1104 } 1105} 1106 1107static int ibmveth_change_mtu(struct net_device *dev, int new_mtu) 1108{ 1109 struct ibmveth_adapter *adapter = netdev_priv(dev); 1110 struct vio_dev *viodev = adapter->vdev; 1111 int new_mtu_oh = new_mtu + IBMVETH_BUFF_OH; 1112 int i; 1113 1114 if (new_mtu < IBMVETH_MAX_MTU) 1115 return -EINVAL; 1116 1117 for (i = 0; i < IbmVethNumBufferPools; i++) 1118 if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) 1119 break; 1120 1121 if (i == IbmVethNumBufferPools) 1122 return -EINVAL; 1123 1124 /* Deactivate all the buffer pools so that the next loop can activate 1125 only the buffer pools necessary to hold the new MTU */ 1126 for (i = 0; i < IbmVethNumBufferPools; i++) 1127 if (adapter->rx_buff_pool[i].active) { 1128 ibmveth_free_buffer_pool(adapter, 1129 &adapter->rx_buff_pool[i]); 1130 adapter->rx_buff_pool[i].active = 0; 1131 } 1132 1133 /* Look for an active buffer pool that can hold the new MTU */ 1134 for(i = 0; i<IbmVethNumBufferPools; i++) { 1135 adapter->rx_buff_pool[i].active = 1; 1136 1137 if (new_mtu_oh < adapter->rx_buff_pool[i].buff_size) { 1138 if (netif_running(adapter->netdev)) { 1139 adapter->pool_config = 1; 1140 ibmveth_close(adapter->netdev); 1141 adapter->pool_config = 0; 1142 dev->mtu = new_mtu; 1143 vio_cmo_set_dev_desired(viodev, 1144 ibmveth_get_desired_dma 1145 (viodev)); 1146 return ibmveth_open(adapter->netdev); 1147 } 1148 dev->mtu = new_mtu; 1149 vio_cmo_set_dev_desired(viodev, 1150 ibmveth_get_desired_dma 1151 (viodev)); 1152 return 0; 1153 } 1154 } 1155 return -EINVAL; 1156} 1157 1158#ifdef CONFIG_NET_POLL_CONTROLLER 1159static void ibmveth_poll_controller(struct net_device *dev) 1160{ 1161 ibmveth_replenish_task(netdev_priv(dev)); 1162 ibmveth_interrupt(dev->irq, dev); 1163} 1164#endif 1165 1166/** 1167 * ibmveth_get_desired_dma - Calculate IO memory desired by the driver 1168 * 1169 * @vdev: struct vio_dev for the device whose desired IO mem is to be returned 1170 * 1171 * Return value: 1172 * Number of bytes of IO data the driver will need to perform well. 1173 */ 1174static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev) 1175{ 1176 struct net_device *netdev = dev_get_drvdata(&vdev->dev); 1177 struct ibmveth_adapter *adapter; 1178 unsigned long ret; 1179 int i; 1180 int rxqentries = 1; 1181 1182 /* netdev inits at probe time along with the structures we need below*/ 1183 if (netdev == NULL) 1184 return IOMMU_PAGE_ALIGN(IBMVETH_IO_ENTITLEMENT_DEFAULT); 1185 1186 adapter = netdev_priv(netdev); 1187 1188 ret = IBMVETH_BUFF_LIST_SIZE + IBMVETH_FILT_LIST_SIZE; 1189 ret += IOMMU_PAGE_ALIGN(netdev->mtu); 1190 1191 for (i = 0; i < IbmVethNumBufferPools; i++) { 1192 /* add the size of the active receive buffers */ 1193 if (adapter->rx_buff_pool[i].active) 1194 ret += 1195 adapter->rx_buff_pool[i].size * 1196 IOMMU_PAGE_ALIGN(adapter->rx_buff_pool[i]. 1197 buff_size); 1198 rxqentries += adapter->rx_buff_pool[i].size; 1199 } 1200 /* add the size of the receive queue entries */ 1201 ret += IOMMU_PAGE_ALIGN(rxqentries * sizeof(struct ibmveth_rx_q_entry)); 1202 1203 return ret; 1204} 1205 1206static int __devinit ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) 1207{ 1208 int rc, i; 1209 long ret; 1210 struct net_device *netdev; 1211 struct ibmveth_adapter *adapter; 1212 unsigned long set_attr, ret_attr; 1213 1214 unsigned char *mac_addr_p; 1215 unsigned int *mcastFilterSize_p; 1216 1217 1218 ibmveth_debug_printk_no_adapter("entering ibmveth_probe for UA 0x%x\n", 1219 dev->unit_address); 1220 1221 mac_addr_p = (unsigned char *) vio_get_attribute(dev, 1222 VETH_MAC_ADDR, NULL); 1223 if(!mac_addr_p) { 1224 printk(KERN_ERR "(%s:%3.3d) ERROR: Can't find VETH_MAC_ADDR " 1225 "attribute\n", __FILE__, __LINE__); 1226 return 0; 1227 } 1228 1229 mcastFilterSize_p = (unsigned int *) vio_get_attribute(dev, 1230 VETH_MCAST_FILTER_SIZE, NULL); 1231 if(!mcastFilterSize_p) { 1232 printk(KERN_ERR "(%s:%3.3d) ERROR: Can't find " 1233 "VETH_MCAST_FILTER_SIZE attribute\n", 1234 __FILE__, __LINE__); 1235 return 0; 1236 } 1237 1238 netdev = alloc_etherdev(sizeof(struct ibmveth_adapter)); 1239 1240 if(!netdev) 1241 return -ENOMEM; 1242 1243 adapter = netdev_priv(netdev); 1244 dev->dev.driver_data = netdev; 1245 1246 adapter->vdev = dev; 1247 adapter->netdev = netdev; 1248 adapter->mcastFilterSize= *mcastFilterSize_p; 1249 adapter->pool_config = 0; 1250 1251 netif_napi_add(netdev, &adapter->napi, ibmveth_poll, 16); 1252 1253 /* Some older boxes running PHYP non-natively have an OF that 1254 returns a 8-byte local-mac-address field (and the first 1255 2 bytes have to be ignored) while newer boxes' OF return 1256 a 6-byte field. Note that IEEE 1275 specifies that 1257 local-mac-address must be a 6-byte field. 1258 The RPA doc specifies that the first byte must be 10b, so 1259 we'll just look for it to solve this 8 vs. 6 byte field issue */ 1260 1261 if ((*mac_addr_p & 0x3) != 0x02) 1262 mac_addr_p += 2; 1263 1264 adapter->mac_addr = 0; 1265 memcpy(&adapter->mac_addr, mac_addr_p, 6); 1266 1267 netdev->irq = dev->irq; 1268 netdev->open = ibmveth_open; 1269 netdev->stop = ibmveth_close; 1270 netdev->hard_start_xmit = ibmveth_start_xmit; 1271 netdev->set_multicast_list = ibmveth_set_multicast_list; 1272 netdev->do_ioctl = ibmveth_ioctl; 1273 netdev->ethtool_ops = &netdev_ethtool_ops; 1274 netdev->change_mtu = ibmveth_change_mtu; 1275 SET_NETDEV_DEV(netdev, &dev->dev); 1276#ifdef CONFIG_NET_POLL_CONTROLLER 1277 netdev->poll_controller = ibmveth_poll_controller; 1278#endif 1279 netdev->features |= NETIF_F_LLTX; 1280 spin_lock_init(&adapter->stats_lock); 1281 1282 memcpy(&netdev->dev_addr, &adapter->mac_addr, netdev->addr_len); 1283 1284 for(i = 0; i<IbmVethNumBufferPools; i++) { 1285 struct kobject *kobj = &adapter->rx_buff_pool[i].kobj; 1286 int error; 1287 1288 ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i, 1289 pool_count[i], pool_size[i], 1290 pool_active[i]); 1291 error = kobject_init_and_add(kobj, &ktype_veth_pool, 1292 &dev->dev.kobj, "pool%d", i); 1293 if (!error) 1294 kobject_uevent(kobj, KOBJ_ADD); 1295 } 1296 1297 ibmveth_debug_printk("adapter @ 0x%p\n", adapter); 1298 1299 adapter->buffer_list_dma = DMA_ERROR_CODE; 1300 adapter->filter_list_dma = DMA_ERROR_CODE; 1301 adapter->rx_queue.queue_dma = DMA_ERROR_CODE; 1302 1303 ibmveth_debug_printk("registering netdev...\n"); 1304 1305 ret = h_illan_attributes(dev->unit_address, 0, 0, &ret_attr); 1306 1307 if (ret == H_SUCCESS && !(ret_attr & IBMVETH_ILLAN_ACTIVE_TRUNK) && 1308 !(ret_attr & IBMVETH_ILLAN_TRUNK_PRI_MASK) && 1309 (ret_attr & IBMVETH_ILLAN_PADDED_PKT_CSUM)) { 1310 set_attr = IBMVETH_ILLAN_IPV4_TCP_CSUM; 1311 1312 ret = h_illan_attributes(dev->unit_address, 0, set_attr, &ret_attr); 1313 1314 if (ret == H_SUCCESS) { 1315 adapter->rx_csum = 1; 1316 netdev->features |= NETIF_F_IP_CSUM; 1317 } else 1318 ret = h_illan_attributes(dev->unit_address, set_attr, 0, &ret_attr); 1319 } 1320 1321 rc = register_netdev(netdev); 1322 1323 if(rc) { 1324 ibmveth_debug_printk("failed to register netdev rc=%d\n", rc); 1325 free_netdev(netdev); 1326 return rc; 1327 } 1328 1329 ibmveth_debug_printk("registered\n"); 1330 1331 ibmveth_proc_register_adapter(adapter); 1332 1333 return 0; 1334} 1335 1336static int __devexit ibmveth_remove(struct vio_dev *dev) 1337{ 1338 struct net_device *netdev = dev->dev.driver_data; 1339 struct ibmveth_adapter *adapter = netdev_priv(netdev); 1340 int i; 1341 1342 for(i = 0; i<IbmVethNumBufferPools; i++) 1343 kobject_put(&adapter->rx_buff_pool[i].kobj); 1344 1345 unregister_netdev(netdev); 1346 1347 ibmveth_proc_unregister_adapter(adapter); 1348 1349 free_netdev(netdev); 1350 dev_set_drvdata(&dev->dev, NULL); 1351 1352 return 0; 1353} 1354 1355#ifdef CONFIG_PROC_FS 1356static void ibmveth_proc_register_driver(void) 1357{ 1358 ibmveth_proc_dir = proc_mkdir(IBMVETH_PROC_DIR, init_net.proc_net); 1359 if (ibmveth_proc_dir) { 1360 } 1361} 1362 1363static void ibmveth_proc_unregister_driver(void) 1364{ 1365 remove_proc_entry(IBMVETH_PROC_DIR, init_net.proc_net); 1366} 1367 1368static int ibmveth_show(struct seq_file *seq, void *v) 1369{ 1370 struct ibmveth_adapter *adapter = seq->private; 1371 char *current_mac = ((char*) &adapter->netdev->dev_addr); 1372 char *firmware_mac = ((char*) &adapter->mac_addr) ; 1373 1374 seq_printf(seq, "%s %s\n\n", ibmveth_driver_string, ibmveth_driver_version); 1375 1376 seq_printf(seq, "Unit Address: 0x%x\n", adapter->vdev->unit_address); 1377 seq_printf(seq, "Current MAC: %pM\n", current_mac); 1378 seq_printf(seq, "Firmware MAC: %pM\n", firmware_mac); 1379 1380 seq_printf(seq, "\nAdapter Statistics:\n"); 1381 seq_printf(seq, " TX: vio_map_single failres: %lld\n", adapter->tx_map_failed); 1382 seq_printf(seq, " send failures: %lld\n", adapter->tx_send_failed); 1383 seq_printf(seq, " RX: replenish task cycles: %lld\n", adapter->replenish_task_cycles); 1384 seq_printf(seq, " alloc_skb_failures: %lld\n", adapter->replenish_no_mem); 1385 seq_printf(seq, " add buffer failures: %lld\n", adapter->replenish_add_buff_failure); 1386 seq_printf(seq, " invalid buffers: %lld\n", adapter->rx_invalid_buffer); 1387 seq_printf(seq, " no buffers: %lld\n", adapter->rx_no_buffer); 1388 1389 return 0; 1390} 1391 1392static int ibmveth_proc_open(struct inode *inode, struct file *file) 1393{ 1394 return single_open(file, ibmveth_show, PDE(inode)->data); 1395} 1396 1397static const struct file_operations ibmveth_proc_fops = { 1398 .owner = THIS_MODULE, 1399 .open = ibmveth_proc_open, 1400 .read = seq_read, 1401 .llseek = seq_lseek, 1402 .release = single_release, 1403}; 1404 1405static void ibmveth_proc_register_adapter(struct ibmveth_adapter *adapter) 1406{ 1407 struct proc_dir_entry *entry; 1408 if (ibmveth_proc_dir) { 1409 char u_addr[10]; 1410 sprintf(u_addr, "%x", adapter->vdev->unit_address); 1411 entry = proc_create_data(u_addr, S_IFREG, ibmveth_proc_dir, 1412 &ibmveth_proc_fops, adapter); 1413 if (!entry) 1414 ibmveth_error_printk("Cannot create adapter proc entry"); 1415 } 1416 return; 1417} 1418 1419static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter) 1420{ 1421 if (ibmveth_proc_dir) { 1422 char u_addr[10]; 1423 sprintf(u_addr, "%x", adapter->vdev->unit_address); 1424 remove_proc_entry(u_addr, ibmveth_proc_dir); 1425 } 1426} 1427 1428#else /* CONFIG_PROC_FS */ 1429static void ibmveth_proc_register_adapter(struct ibmveth_adapter *adapter) 1430{ 1431} 1432 1433static void ibmveth_proc_unregister_adapter(struct ibmveth_adapter *adapter) 1434{ 1435} 1436static void ibmveth_proc_register_driver(void) 1437{ 1438} 1439 1440static void ibmveth_proc_unregister_driver(void) 1441{ 1442} 1443#endif /* CONFIG_PROC_FS */ 1444 1445static struct attribute veth_active_attr; 1446static struct attribute veth_num_attr; 1447static struct attribute veth_size_attr; 1448 1449static ssize_t veth_pool_show(struct kobject * kobj, 1450 struct attribute * attr, char * buf) 1451{ 1452 struct ibmveth_buff_pool *pool = container_of(kobj, 1453 struct ibmveth_buff_pool, 1454 kobj); 1455 1456 if (attr == &veth_active_attr) 1457 return sprintf(buf, "%d\n", pool->active); 1458 else if (attr == &veth_num_attr) 1459 return sprintf(buf, "%d\n", pool->size); 1460 else if (attr == &veth_size_attr) 1461 return sprintf(buf, "%d\n", pool->buff_size); 1462 return 0; 1463} 1464 1465static ssize_t veth_pool_store(struct kobject * kobj, struct attribute * attr, 1466const char * buf, size_t count) 1467{ 1468 struct ibmveth_buff_pool *pool = container_of(kobj, 1469 struct ibmveth_buff_pool, 1470 kobj); 1471 struct net_device *netdev = 1472 container_of(kobj->parent, struct device, kobj)->driver_data; 1473 struct ibmveth_adapter *adapter = netdev_priv(netdev); 1474 long value = simple_strtol(buf, NULL, 10); 1475 long rc; 1476 1477 if (attr == &veth_active_attr) { 1478 if (value && !pool->active) { 1479 if (netif_running(netdev)) { 1480 if(ibmveth_alloc_buffer_pool(pool)) { 1481 ibmveth_error_printk("unable to alloc pool\n"); 1482 return -ENOMEM; 1483 } 1484 pool->active = 1; 1485 adapter->pool_config = 1; 1486 ibmveth_close(netdev); 1487 adapter->pool_config = 0; 1488 if ((rc = ibmveth_open(netdev))) 1489 return rc; 1490 } else 1491 pool->active = 1; 1492 } else if (!value && pool->active) { 1493 int mtu = netdev->mtu + IBMVETH_BUFF_OH; 1494 int i; 1495 /* Make sure there is a buffer pool with buffers that 1496 can hold a packet of the size of the MTU */ 1497 for (i = 0; i < IbmVethNumBufferPools; i++) { 1498 if (pool == &adapter->rx_buff_pool[i]) 1499 continue; 1500 if (!adapter->rx_buff_pool[i].active) 1501 continue; 1502 if (mtu <= adapter->rx_buff_pool[i].buff_size) 1503 break; 1504 } 1505 1506 if (i == IbmVethNumBufferPools) { 1507 ibmveth_error_printk("no active pool >= MTU\n"); 1508 return -EPERM; 1509 } 1510 1511 if (netif_running(netdev)) { 1512 adapter->pool_config = 1; 1513 ibmveth_close(netdev); 1514 pool->active = 0; 1515 adapter->pool_config = 0; 1516 if ((rc = ibmveth_open(netdev))) 1517 return rc; 1518 } 1519 pool->active = 0; 1520 } 1521 } else if (attr == &veth_num_attr) { 1522 if (value <= 0 || value > IBMVETH_MAX_POOL_COUNT) 1523 return -EINVAL; 1524 else { 1525 if (netif_running(netdev)) { 1526 adapter->pool_config = 1; 1527 ibmveth_close(netdev); 1528 adapter->pool_config = 0; 1529 pool->size = value; 1530 if ((rc = ibmveth_open(netdev))) 1531 return rc; 1532 } else 1533 pool->size = value; 1534 } 1535 } else if (attr == &veth_size_attr) { 1536 if (value <= IBMVETH_BUFF_OH || value > IBMVETH_MAX_BUF_SIZE) 1537 return -EINVAL; 1538 else { 1539 if (netif_running(netdev)) { 1540 adapter->pool_config = 1; 1541 ibmveth_close(netdev); 1542 adapter->pool_config = 0; 1543 pool->buff_size = value; 1544 if ((rc = ibmveth_open(netdev))) 1545 return rc; 1546 } else 1547 pool->buff_size = value; 1548 } 1549 } 1550 1551 /* kick the interrupt handler to allocate/deallocate pools */ 1552 ibmveth_interrupt(netdev->irq, netdev); 1553 return count; 1554} 1555 1556 1557#define ATTR(_name, _mode) \ 1558 struct attribute veth_##_name##_attr = { \ 1559 .name = __stringify(_name), .mode = _mode, \ 1560 }; 1561 1562static ATTR(active, 0644); 1563static ATTR(num, 0644); 1564static ATTR(size, 0644); 1565 1566static struct attribute * veth_pool_attrs[] = { 1567 &veth_active_attr, 1568 &veth_num_attr, 1569 &veth_size_attr, 1570 NULL, 1571}; 1572 1573static struct sysfs_ops veth_pool_ops = { 1574 .show = veth_pool_show, 1575 .store = veth_pool_store, 1576}; 1577 1578static struct kobj_type ktype_veth_pool = { 1579 .release = NULL, 1580 .sysfs_ops = &veth_pool_ops, 1581 .default_attrs = veth_pool_attrs, 1582}; 1583 1584 1585static struct vio_device_id ibmveth_device_table[] __devinitdata= { 1586 { "network", "IBM,l-lan"}, 1587 { "", "" } 1588}; 1589MODULE_DEVICE_TABLE(vio, ibmveth_device_table); 1590 1591static struct vio_driver ibmveth_driver = { 1592 .id_table = ibmveth_device_table, 1593 .probe = ibmveth_probe, 1594 .remove = ibmveth_remove, 1595 .get_desired_dma = ibmveth_get_desired_dma, 1596 .driver = { 1597 .name = ibmveth_driver_name, 1598 .owner = THIS_MODULE, 1599 } 1600}; 1601 1602static int __init ibmveth_module_init(void) 1603{ 1604 ibmveth_printk("%s: %s %s\n", ibmveth_driver_name, ibmveth_driver_string, ibmveth_driver_version); 1605 1606 ibmveth_proc_register_driver(); 1607 1608 return vio_register_driver(&ibmveth_driver); 1609} 1610 1611static void __exit ibmveth_module_exit(void) 1612{ 1613 vio_unregister_driver(&ibmveth_driver); 1614 ibmveth_proc_unregister_driver(); 1615} 1616 1617module_init(ibmveth_module_init); 1618module_exit(ibmveth_module_exit);