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

[PATCH] SAA9730: Driver overhaul

o Try to work around some of the undocumented "features" of the SAA9730
o Use netdev_priv() instead of the previous broken mechanism to allocate
the private data structure.
o Try to make sure we don't leak resources on exit.
o No more need to call SET_MODULE_OWNER in 2.6.
o Use pci_free_consistent instead of homegrown architecture-specific
allocation.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>

drivers/net/saa9730.c | 531 +++++++++++++++++++++++---------------------------
1 files changed, 249 insertions(+), 282 deletions(-)
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>

authored by

Ralf Baechle and committed by
Jeff Garzik
05d9c84d 62ff0d0a

+249 -282
+249 -282
drivers/net/saa9730.c
··· 1 1 /* 2 - * Carsten Langgaard, carstenl@mips.com 3 - * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. 4 - * 5 - * ######################################################################## 2 + * Copyright (C) 2000, 2005 MIPS Technologies, Inc. All rights reserved. 3 + * Authors: Carsten Langgaard <carstenl@mips.com> 4 + * Maciej W. Rozycki <macro@mips.com> 5 + * Copyright (C) 2004 Ralf Baechle <ralf@linux-mips.org> 6 6 * 7 7 * This program is free software; you can distribute it and/or modify it 8 8 * under the terms of the GNU General Public License (Version 2) as ··· 17 17 * with this program; if not, write to the Free Software Foundation, Inc., 18 18 * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. 19 19 * 20 - * ######################################################################## 21 - * 22 20 * SAA9730 ethernet driver. 23 21 * 24 22 * Changes: 25 - * Angelo Dell'Aera <buffer@antifork.org> : Conversion to the new PCI API (pci_driver). 26 - * Conversion to spinlocks. 27 - * Error handling fixes. 28 - * 23 + * Angelo Dell'Aera <buffer@antifork.org> : Conversion to the new PCI API 24 + * (pci_driver). 25 + * Conversion to spinlocks. 26 + * Error handling fixes. 29 27 */ 30 28 31 29 #include <linux/init.h> ··· 34 36 #include <linux/skbuff.h> 35 37 #include <linux/pci.h> 36 38 #include <linux/spinlock.h> 39 + #include <linux/types.h> 37 40 38 41 #include <asm/addrspace.h> 42 + #include <asm/io.h> 43 + 39 44 #include <asm/mips-boards/prom.h> 40 45 41 46 #include "saa9730.h" ··· 52 51 #define DRV_MODULE_NAME "saa9730" 53 52 54 53 static struct pci_device_id saa9730_pci_tbl[] = { 55 - { PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA9370, 54 + { PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA9730, 56 55 PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, 57 56 { 0, } 58 57 }; ··· 62 61 /* Non-zero only if the current card is a PCI with BIOS-set IRQ. */ 63 62 static unsigned int pci_irq_line; 64 63 65 - #define INL(a) inl((unsigned long)a) 66 - #define OUTL(x,a) outl(x,(unsigned long)a) 67 - 68 64 static void evm_saa9730_enable_lan_int(struct lan_saa9730_private *lp) 69 65 { 70 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 66 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 71 67 &lp->evm_saa9730_regs->InterruptBlock1); 72 - OUTL(INL(&lp->evm_saa9730_regs->InterruptStatus1) | EVM_LAN_INT, 68 + outl(readl(&lp->evm_saa9730_regs->InterruptStatus1) | EVM_LAN_INT, 73 69 &lp->evm_saa9730_regs->InterruptStatus1); 74 - OUTL(INL(&lp->evm_saa9730_regs->InterruptEnable1) | EVM_LAN_INT | 70 + outl(readl(&lp->evm_saa9730_regs->InterruptEnable1) | EVM_LAN_INT | 75 71 EVM_MASTER_EN, &lp->evm_saa9730_regs->InterruptEnable1); 76 72 } 73 + 77 74 static void evm_saa9730_disable_lan_int(struct lan_saa9730_private *lp) 78 75 { 79 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 76 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 80 77 &lp->evm_saa9730_regs->InterruptBlock1); 81 - OUTL(INL(&lp->evm_saa9730_regs->InterruptEnable1) & ~EVM_LAN_INT, 78 + outl(readl(&lp->evm_saa9730_regs->InterruptEnable1) & ~EVM_LAN_INT, 82 79 &lp->evm_saa9730_regs->InterruptEnable1); 83 80 } 84 81 85 82 static void evm_saa9730_clear_lan_int(struct lan_saa9730_private *lp) 86 83 { 87 - OUTL(EVM_LAN_INT, &lp->evm_saa9730_regs->InterruptStatus1); 84 + outl(EVM_LAN_INT, &lp->evm_saa9730_regs->InterruptStatus1); 88 85 } 89 86 90 87 static void evm_saa9730_block_lan_int(struct lan_saa9730_private *lp) 91 88 { 92 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 89 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) & ~EVM_LAN_INT, 93 90 &lp->evm_saa9730_regs->InterruptBlock1); 94 91 } 95 92 96 93 static void evm_saa9730_unblock_lan_int(struct lan_saa9730_private *lp) 97 94 { 98 - OUTL(INL(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 95 + outl(readl(&lp->evm_saa9730_regs->InterruptBlock1) | EVM_LAN_INT, 99 96 &lp->evm_saa9730_regs->InterruptBlock1); 100 97 } 101 98 102 - static void show_saa9730_regs(struct lan_saa9730_private *lp) 99 + static void __attribute_used__ show_saa9730_regs(struct lan_saa9730_private *lp) 103 100 { 104 101 int i, j; 105 - printk("TxmBufferA = %x\n", lp->TxmBuffer[0][0]); 106 - printk("TxmBufferB = %x\n", lp->TxmBuffer[1][0]); 107 - printk("RcvBufferA = %x\n", lp->RcvBuffer[0][0]); 108 - printk("RcvBufferB = %x\n", lp->RcvBuffer[1][0]); 102 + printk("TxmBufferA = %p\n", lp->TxmBuffer[0][0]); 103 + printk("TxmBufferB = %p\n", lp->TxmBuffer[1][0]); 104 + printk("RcvBufferA = %p\n", lp->RcvBuffer[0][0]); 105 + printk("RcvBufferB = %p\n", lp->RcvBuffer[1][0]); 109 106 for (i = 0; i < LAN_SAA9730_BUFFERS; i++) { 110 107 for (j = 0; j < LAN_SAA9730_TXM_Q_SIZE; j++) { 111 108 printk("TxmBuffer[%d][%d] = %x\n", i, j, ··· 119 120 } 120 121 } 121 122 printk("lp->evm_saa9730_regs->InterruptBlock1 = %x\n", 122 - INL(&lp->evm_saa9730_regs->InterruptBlock1)); 123 + readl(&lp->evm_saa9730_regs->InterruptBlock1)); 123 124 printk("lp->evm_saa9730_regs->InterruptStatus1 = %x\n", 124 - INL(&lp->evm_saa9730_regs->InterruptStatus1)); 125 + readl(&lp->evm_saa9730_regs->InterruptStatus1)); 125 126 printk("lp->evm_saa9730_regs->InterruptEnable1 = %x\n", 126 - INL(&lp->evm_saa9730_regs->InterruptEnable1)); 127 + readl(&lp->evm_saa9730_regs->InterruptEnable1)); 127 128 printk("lp->lan_saa9730_regs->Ok2Use = %x\n", 128 - INL(&lp->lan_saa9730_regs->Ok2Use)); 129 + readl(&lp->lan_saa9730_regs->Ok2Use)); 129 130 printk("lp->NextTxmBufferIndex = %x\n", lp->NextTxmBufferIndex); 130 131 printk("lp->NextTxmPacketIndex = %x\n", lp->NextTxmPacketIndex); 131 132 printk("lp->PendingTxmBufferIndex = %x\n", ··· 133 134 printk("lp->PendingTxmPacketIndex = %x\n", 134 135 lp->PendingTxmPacketIndex); 135 136 printk("lp->lan_saa9730_regs->LanDmaCtl = %x\n", 136 - INL(&lp->lan_saa9730_regs->LanDmaCtl)); 137 + readl(&lp->lan_saa9730_regs->LanDmaCtl)); 137 138 printk("lp->lan_saa9730_regs->DmaStatus = %x\n", 138 - INL(&lp->lan_saa9730_regs->DmaStatus)); 139 + readl(&lp->lan_saa9730_regs->DmaStatus)); 139 140 printk("lp->lan_saa9730_regs->CamCtl = %x\n", 140 - INL(&lp->lan_saa9730_regs->CamCtl)); 141 + readl(&lp->lan_saa9730_regs->CamCtl)); 141 142 printk("lp->lan_saa9730_regs->TxCtl = %x\n", 142 - INL(&lp->lan_saa9730_regs->TxCtl)); 143 + readl(&lp->lan_saa9730_regs->TxCtl)); 143 144 printk("lp->lan_saa9730_regs->TxStatus = %x\n", 144 - INL(&lp->lan_saa9730_regs->TxStatus)); 145 + readl(&lp->lan_saa9730_regs->TxStatus)); 145 146 printk("lp->lan_saa9730_regs->RxCtl = %x\n", 146 - INL(&lp->lan_saa9730_regs->RxCtl)); 147 + readl(&lp->lan_saa9730_regs->RxCtl)); 147 148 printk("lp->lan_saa9730_regs->RxStatus = %x\n", 148 - INL(&lp->lan_saa9730_regs->RxStatus)); 149 + readl(&lp->lan_saa9730_regs->RxStatus)); 149 150 for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) { 150 - OUTL(i, &lp->lan_saa9730_regs->CamAddress); 151 + outl(i, &lp->lan_saa9730_regs->CamAddress); 151 152 printk("lp->lan_saa9730_regs->CamData = %x\n", 152 - INL(&lp->lan_saa9730_regs->CamData)); 153 + readl(&lp->lan_saa9730_regs->CamData)); 153 154 } 154 155 printk("lp->stats.tx_packets = %lx\n", lp->stats.tx_packets); 155 156 printk("lp->stats.tx_errors = %lx\n", lp->stats.tx_errors); ··· 177 178 lp->stats.rx_length_errors); 178 179 179 180 printk("lp->lan_saa9730_regs->DebugPCIMasterAddr = %x\n", 180 - INL(&lp->lan_saa9730_regs->DebugPCIMasterAddr)); 181 + readl(&lp->lan_saa9730_regs->DebugPCIMasterAddr)); 181 182 printk("lp->lan_saa9730_regs->DebugLanTxStateMachine = %x\n", 182 - INL(&lp->lan_saa9730_regs->DebugLanTxStateMachine)); 183 + readl(&lp->lan_saa9730_regs->DebugLanTxStateMachine)); 183 184 printk("lp->lan_saa9730_regs->DebugLanRxStateMachine = %x\n", 184 - INL(&lp->lan_saa9730_regs->DebugLanRxStateMachine)); 185 + readl(&lp->lan_saa9730_regs->DebugLanRxStateMachine)); 185 186 printk("lp->lan_saa9730_regs->DebugLanTxFifoPointers = %x\n", 186 - INL(&lp->lan_saa9730_regs->DebugLanTxFifoPointers)); 187 + readl(&lp->lan_saa9730_regs->DebugLanTxFifoPointers)); 187 188 printk("lp->lan_saa9730_regs->DebugLanRxFifoPointers = %x\n", 188 - INL(&lp->lan_saa9730_regs->DebugLanRxFifoPointers)); 189 + readl(&lp->lan_saa9730_regs->DebugLanRxFifoPointers)); 189 190 printk("lp->lan_saa9730_regs->DebugLanCtlStateMachine = %x\n", 190 - INL(&lp->lan_saa9730_regs->DebugLanCtlStateMachine)); 191 + readl(&lp->lan_saa9730_regs->DebugLanCtlStateMachine)); 191 192 } 192 193 193 194 static void lan_saa9730_buffer_init(struct lan_saa9730_private *lp) ··· 213 214 } 214 215 } 215 216 216 - static int lan_saa9730_allocate_buffers(struct lan_saa9730_private *lp) 217 + static void lan_saa9730_free_buffers(struct pci_dev *pdev, 218 + struct lan_saa9730_private *lp) 217 219 { 218 - unsigned int mem_size; 220 + pci_free_consistent(pdev, lp->buffer_size, lp->buffer_start, 221 + lp->dma_addr); 222 + } 223 + 224 + static int lan_saa9730_allocate_buffers(struct pci_dev *pdev, 225 + struct lan_saa9730_private *lp) 226 + { 219 227 void *Pa; 220 - unsigned int i, j, RcvBufferSize, TxmBufferSize; 221 - unsigned int buffer_start; 228 + unsigned int i, j, rxoffset, txoffset; 229 + int ret; 230 + 231 + /* Initialize buffer space */ 232 + lp->DmaRcvPackets = LAN_SAA9730_RCV_Q_SIZE; 233 + lp->DmaTxmPackets = LAN_SAA9730_TXM_Q_SIZE; 234 + 235 + /* Initialize Rx Buffer Index */ 236 + lp->NextRcvPacketIndex = 0; 237 + lp->NextRcvBufferIndex = 0; 238 + 239 + /* Set current buffer index & next available packet index */ 240 + lp->NextTxmPacketIndex = 0; 241 + lp->NextTxmBufferIndex = 0; 242 + lp->PendingTxmPacketIndex = 0; 243 + lp->PendingTxmBufferIndex = 0; 222 244 223 245 /* 224 246 * Allocate all RX and TX packets in one chunk. 225 247 * The Rx and Tx packets must be PACKET_SIZE aligned. 226 248 */ 227 - mem_size = ((LAN_SAA9730_RCV_Q_SIZE + LAN_SAA9730_TXM_Q_SIZE) * 228 - LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_BUFFERS) + 229 - LAN_SAA9730_PACKET_SIZE; 230 - buffer_start = 231 - (unsigned int) kmalloc(mem_size, GFP_DMA | GFP_KERNEL); 249 + lp->buffer_size = ((LAN_SAA9730_RCV_Q_SIZE + LAN_SAA9730_TXM_Q_SIZE) * 250 + LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_BUFFERS) + 251 + LAN_SAA9730_PACKET_SIZE; 252 + lp->buffer_start = pci_alloc_consistent(pdev, lp->buffer_size, 253 + &lp->dma_addr); 254 + if (!lp->buffer_start) { 255 + ret = -ENOMEM; 256 + goto out; 257 + } 232 258 233 - if (!buffer_start) 234 - return -ENOMEM; 259 + Pa = (void *)ALIGN((unsigned long)lp->buffer_start, 260 + LAN_SAA9730_PACKET_SIZE); 235 261 236 - /* 237 - * Set DMA buffer to kseg1 (uncached). 238 - * Make sure to flush before using it uncached. 239 - */ 240 - Pa = (void *) KSEG1ADDR((buffer_start + LAN_SAA9730_PACKET_SIZE) & 241 - ~(LAN_SAA9730_PACKET_SIZE - 1)); 242 - dma_cache_wback_inv((unsigned long) Pa, mem_size); 243 - 244 - /* Initialize buffer space */ 245 - RcvBufferSize = LAN_SAA9730_PACKET_SIZE; 246 - TxmBufferSize = LAN_SAA9730_PACKET_SIZE; 247 - lp->DmaRcvPackets = LAN_SAA9730_RCV_Q_SIZE; 248 - lp->DmaTxmPackets = LAN_SAA9730_TXM_Q_SIZE; 262 + rxoffset = Pa - lp->buffer_start; 249 263 250 264 /* Init RX buffers */ 251 265 for (i = 0; i < LAN_SAA9730_BUFFERS; i++) { ··· 266 254 *(unsigned int *) Pa = 267 255 cpu_to_le32(RXSF_READY << 268 256 RX_STAT_CTL_OWNER_SHF); 269 - lp->RcvBuffer[i][j] = (unsigned int) Pa; 270 - Pa += RcvBufferSize; 257 + lp->RcvBuffer[i][j] = Pa; 258 + Pa += LAN_SAA9730_PACKET_SIZE; 271 259 } 272 260 } 261 + 262 + txoffset = Pa - lp->buffer_start; 273 263 274 264 /* Init TX buffers */ 275 265 for (i = 0; i < LAN_SAA9730_BUFFERS; i++) { ··· 279 265 *(unsigned int *) Pa = 280 266 cpu_to_le32(TXSF_EMPTY << 281 267 TX_STAT_CTL_OWNER_SHF); 282 - lp->TxmBuffer[i][j] = (unsigned int) Pa; 283 - Pa += TxmBufferSize; 268 + lp->TxmBuffer[i][j] = Pa; 269 + Pa += LAN_SAA9730_PACKET_SIZE; 284 270 } 285 271 } 286 272 ··· 288 274 * Set rx buffer A and rx buffer B to point to the first two buffer 289 275 * spaces. 290 276 */ 291 - OUTL(PHYSADDR(lp->RcvBuffer[0][0]), 277 + outl(lp->dma_addr + rxoffset, 292 278 &lp->lan_saa9730_regs->RxBuffA); 293 - OUTL(PHYSADDR(lp->RcvBuffer[1][0]), 279 + outl(lp->dma_addr + rxoffset + 280 + LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_RCV_Q_SIZE, 294 281 &lp->lan_saa9730_regs->RxBuffB); 295 - 296 - /* Initialize Buffer Index */ 297 - lp->NextRcvPacketIndex = 0; 298 - lp->NextRcvToUseIsA = 1; 299 - 300 - /* Set current buffer index & next availble packet index */ 301 - lp->NextTxmPacketIndex = 0; 302 - lp->NextTxmBufferIndex = 0; 303 - lp->PendingTxmPacketIndex = 0; 304 - lp->PendingTxmBufferIndex = 0; 305 282 306 283 /* 307 284 * Set txm_buf_a and txm_buf_b to point to the first two buffer 308 285 * space 309 286 */ 310 - OUTL(PHYSADDR(lp->TxmBuffer[0][0]), 287 + outl(lp->dma_addr + txoffset, 311 288 &lp->lan_saa9730_regs->TxBuffA); 312 - OUTL(PHYSADDR(lp->TxmBuffer[1][0]), 289 + outl(lp->dma_addr + txoffset + 290 + LAN_SAA9730_PACKET_SIZE * LAN_SAA9730_TXM_Q_SIZE, 313 291 &lp->lan_saa9730_regs->TxBuffB); 314 292 315 293 /* Set packet number */ 316 - OUTL((lp->DmaRcvPackets << PK_COUNT_RX_A_SHF) | 294 + outl((lp->DmaRcvPackets << PK_COUNT_RX_A_SHF) | 317 295 (lp->DmaRcvPackets << PK_COUNT_RX_B_SHF) | 318 296 (lp->DmaTxmPackets << PK_COUNT_TX_A_SHF) | 319 297 (lp->DmaTxmPackets << PK_COUNT_TX_B_SHF), 320 298 &lp->lan_saa9730_regs->PacketCount); 321 299 322 300 return 0; 301 + 302 + out: 303 + return ret; 323 304 } 324 305 325 306 static int lan_saa9730_cam_load(struct lan_saa9730_private *lp) ··· 326 317 327 318 for (i = 0; i < LAN_SAA9730_CAM_DWORDS; i++) { 328 319 /* First set address to where data is written */ 329 - OUTL(i, &lp->lan_saa9730_regs->CamAddress); 330 - OUTL((NetworkAddress[0] << 24) | (NetworkAddress[1] << 16) 320 + outl(i, &lp->lan_saa9730_regs->CamAddress); 321 + outl((NetworkAddress[0] << 24) | (NetworkAddress[1] << 16) 331 322 | (NetworkAddress[2] << 8) | NetworkAddress[3], 332 323 &lp->lan_saa9730_regs->CamData); 333 324 NetworkAddress += 4; ··· 337 328 338 329 static int lan_saa9730_cam_init(struct net_device *dev) 339 330 { 340 - struct lan_saa9730_private *lp = 341 - (struct lan_saa9730_private *) dev->priv; 331 + struct lan_saa9730_private *lp = netdev_priv(dev); 342 332 unsigned int i; 343 333 344 334 /* Copy MAC-address into all entries. */ ··· 355 347 356 348 /* Check link status, spin here till station is not busy. */ 357 349 i = 0; 358 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 350 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 359 351 i++; 360 352 if (i > 100) { 361 353 printk("Error: lan_saa9730_mii_init: timeout\n"); ··· 365 357 } 366 358 367 359 /* Now set the control and address register. */ 368 - OUTL(MD_CA_BUSY | PHY_STATUS | PHY_ADDRESS << MD_CA_PHY_SHF, 360 + outl(MD_CA_BUSY | PHY_STATUS | PHY_ADDRESS << MD_CA_PHY_SHF, 369 361 &lp->lan_saa9730_regs->StationMgmtCtl); 370 362 371 363 /* check link status, spin here till station is not busy */ 372 364 i = 0; 373 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 365 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & MD_CA_BUSY) { 374 366 i++; 375 367 if (i > 100) { 376 368 printk("Error: lan_saa9730_mii_init: timeout\n"); ··· 383 375 mdelay(1); 384 376 385 377 /* Check the link status. */ 386 - if (INL(&lp->lan_saa9730_regs->StationMgmtData) & 378 + if (readl(&lp->lan_saa9730_regs->StationMgmtData) & 387 379 PHY_STATUS_LINK_UP) { 388 380 /* Link is up. */ 389 381 return 0; ··· 391 383 /* Link is down, reset the PHY first. */ 392 384 393 385 /* set PHY address = 'CONTROL' */ 394 - OUTL(PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | PHY_CONTROL, 386 + outl(PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | PHY_CONTROL, 395 387 &lp->lan_saa9730_regs->StationMgmtCtl); 396 388 397 389 /* Wait for 1 ms. */ 398 390 mdelay(1); 399 391 400 392 /* set 'CONTROL' = force reset and renegotiate */ 401 - OUTL(PHY_CONTROL_RESET | PHY_CONTROL_AUTO_NEG | 393 + outl(PHY_CONTROL_RESET | PHY_CONTROL_AUTO_NEG | 402 394 PHY_CONTROL_RESTART_AUTO_NEG, 403 395 &lp->lan_saa9730_regs->StationMgmtData); 404 396 ··· 406 398 mdelay(50); 407 399 408 400 /* set 'BUSY' to start operation */ 409 - OUTL(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | 401 + outl(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | MD_CA_WR | 410 402 PHY_CONTROL, &lp->lan_saa9730_regs->StationMgmtCtl); 411 403 412 404 /* await completion */ 413 405 i = 0; 414 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & 406 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & 415 407 MD_CA_BUSY) { 416 408 i++; 417 409 if (i > 100) { ··· 427 419 428 420 for (l = 0; l < 2; l++) { 429 421 /* set PHY address = 'STATUS' */ 430 - OUTL(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | 422 + outl(MD_CA_BUSY | PHY_ADDRESS << MD_CA_PHY_SHF | 431 423 PHY_STATUS, 432 424 &lp->lan_saa9730_regs->StationMgmtCtl); 433 425 434 426 /* await completion */ 435 427 i = 0; 436 - while (INL(&lp->lan_saa9730_regs->StationMgmtCtl) & 428 + while (readl(&lp->lan_saa9730_regs->StationMgmtCtl) & 437 429 MD_CA_BUSY) { 438 430 i++; 439 431 if (i > 100) { ··· 448 440 mdelay(3000); 449 441 450 442 /* check the link status */ 451 - if (INL(&lp->lan_saa9730_regs->StationMgmtData) & 443 + if (readl(&lp->lan_saa9730_regs->StationMgmtData) & 452 444 PHY_STATUS_LINK_UP) { 453 445 /* link is up */ 454 446 break; ··· 462 454 static int lan_saa9730_control_init(struct lan_saa9730_private *lp) 463 455 { 464 456 /* Initialize DMA control register. */ 465 - OUTL((LANMB_ANY << DMA_CTL_MAX_XFER_SHF) | 457 + outl((LANMB_ANY << DMA_CTL_MAX_XFER_SHF) | 466 458 (LANEND_LITTLE << DMA_CTL_ENDIAN_SHF) | 467 459 (LAN_SAA9730_RCV_Q_INT_THRESHOLD << DMA_CTL_RX_INT_COUNT_SHF) 468 460 | DMA_CTL_RX_INT_TO_EN | DMA_CTL_RX_INT_EN | ··· 470 462 &lp->lan_saa9730_regs->LanDmaCtl); 471 463 472 464 /* Initial MAC control register. */ 473 - OUTL((MACCM_MII << MAC_CONTROL_CONN_SHF) | MAC_CONTROL_FULL_DUP, 465 + outl((MACCM_MII << MAC_CONTROL_CONN_SHF) | MAC_CONTROL_FULL_DUP, 474 466 &lp->lan_saa9730_regs->MacCtl); 475 467 476 468 /* Initialize CAM control register. */ 477 - OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_BROAD_ACC, 469 + outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_BROAD_ACC, 478 470 &lp->lan_saa9730_regs->CamCtl); 479 471 480 472 /* 481 473 * Initialize CAM enable register, only turn on first entry, should 482 474 * contain own addr. 483 475 */ 484 - OUTL(0x0001, &lp->lan_saa9730_regs->CamEnable); 476 + outl(0x0001, &lp->lan_saa9730_regs->CamEnable); 485 477 486 478 /* Initialize Tx control register */ 487 - OUTL(TX_CTL_EN_COMP, &lp->lan_saa9730_regs->TxCtl); 479 + outl(TX_CTL_EN_COMP, &lp->lan_saa9730_regs->TxCtl); 488 480 489 481 /* Initialize Rcv control register */ 490 - OUTL(RX_CTL_STRIP_CRC, &lp->lan_saa9730_regs->RxCtl); 482 + outl(RX_CTL_STRIP_CRC, &lp->lan_saa9730_regs->RxCtl); 491 483 492 484 /* Reset DMA engine */ 493 - OUTL(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 485 + outl(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 494 486 495 487 return 0; 496 488 } ··· 500 492 int i; 501 493 502 494 /* Stop DMA first */ 503 - OUTL(INL(&lp->lan_saa9730_regs->LanDmaCtl) & 495 + outl(readl(&lp->lan_saa9730_regs->LanDmaCtl) & 504 496 ~(DMA_CTL_EN_TX_DMA | DMA_CTL_EN_RX_DMA), 505 497 &lp->lan_saa9730_regs->LanDmaCtl); 506 498 507 499 /* Set the SW Reset bits in DMA and MAC control registers */ 508 - OUTL(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 509 - OUTL(INL(&lp->lan_saa9730_regs->MacCtl) | MAC_CONTROL_RESET, 500 + outl(DMA_TEST_SW_RESET, &lp->lan_saa9730_regs->DmaTest); 501 + outl(readl(&lp->lan_saa9730_regs->MacCtl) | MAC_CONTROL_RESET, 510 502 &lp->lan_saa9730_regs->MacCtl); 511 503 512 504 /* ··· 514 506 * when the reset is done. 515 507 */ 516 508 i = 0; 517 - while (INL(&lp->lan_saa9730_regs->MacCtl) & MAC_CONTROL_RESET) { 509 + while (readl(&lp->lan_saa9730_regs->MacCtl) & MAC_CONTROL_RESET) { 518 510 i++; 519 511 if (i > 100) { 520 512 printk ··· 532 524 /* Stop lan controller. */ 533 525 lan_saa9730_stop(lp); 534 526 535 - OUTL(LAN_SAA9730_DEFAULT_TIME_OUT_CNT, 527 + outl(LAN_SAA9730_DEFAULT_TIME_OUT_CNT, 536 528 &lp->lan_saa9730_regs->Timeout); 537 529 538 530 return 0; ··· 544 536 545 537 /* Initialize Rx Buffer Index */ 546 538 lp->NextRcvPacketIndex = 0; 547 - lp->NextRcvToUseIsA = 1; 539 + lp->NextRcvBufferIndex = 0; 548 540 549 - /* Set current buffer index & next availble packet index */ 541 + /* Set current buffer index & next available packet index */ 550 542 lp->NextTxmPacketIndex = 0; 551 543 lp->NextTxmBufferIndex = 0; 552 544 lp->PendingTxmPacketIndex = 0; 553 545 lp->PendingTxmBufferIndex = 0; 554 546 555 - OUTL(INL(&lp->lan_saa9730_regs->LanDmaCtl) | DMA_CTL_EN_TX_DMA | 547 + outl(readl(&lp->lan_saa9730_regs->LanDmaCtl) | DMA_CTL_EN_TX_DMA | 556 548 DMA_CTL_EN_RX_DMA, &lp->lan_saa9730_regs->LanDmaCtl); 557 549 558 550 /* For Tx, turn on MAC then DMA */ 559 - OUTL(INL(&lp->lan_saa9730_regs->TxCtl) | TX_CTL_TX_EN, 551 + outl(readl(&lp->lan_saa9730_regs->TxCtl) | TX_CTL_TX_EN, 560 552 &lp->lan_saa9730_regs->TxCtl); 561 553 562 554 /* For Rx, turn on DMA then MAC */ 563 - OUTL(INL(&lp->lan_saa9730_regs->RxCtl) | RX_CTL_RX_EN, 555 + outl(readl(&lp->lan_saa9730_regs->RxCtl) | RX_CTL_RX_EN, 564 556 &lp->lan_saa9730_regs->RxCtl); 565 557 566 - /* Set Ok2Use to let hardware owns the buffers */ 567 - OUTL(OK2USE_RX_A | OK2USE_RX_B | OK2USE_TX_A | OK2USE_TX_B, 568 - &lp->lan_saa9730_regs->Ok2Use); 558 + /* Set Ok2Use to let hardware own the buffers. */ 559 + outl(OK2USE_RX_A | OK2USE_RX_B, &lp->lan_saa9730_regs->Ok2Use); 569 560 570 561 return 0; 571 562 } ··· 579 572 580 573 static int lan_saa9730_tx(struct net_device *dev) 581 574 { 582 - struct lan_saa9730_private *lp = 583 - (struct lan_saa9730_private *) dev->priv; 575 + struct lan_saa9730_private *lp = netdev_priv(dev); 584 576 unsigned int *pPacket; 585 577 unsigned int tx_status; 586 578 ··· 587 581 printk("lan_saa9730_tx interrupt\n"); 588 582 589 583 /* Clear interrupt. */ 590 - OUTL(DMA_STATUS_MAC_TX_INT, &lp->lan_saa9730_regs->DmaStatus); 584 + outl(DMA_STATUS_MAC_TX_INT, &lp->lan_saa9730_regs->DmaStatus); 591 585 592 586 while (1) { 593 - pPacket = 594 - (unsigned int *) lp->TxmBuffer[lp-> 595 - PendingTxmBufferIndex] 596 - [lp->PendingTxmPacketIndex]; 587 + pPacket = lp->TxmBuffer[lp->PendingTxmBufferIndex] 588 + [lp->PendingTxmPacketIndex]; 597 589 598 590 /* Get status of first packet transmitted. */ 599 591 tx_status = le32_to_cpu(*pPacket); ··· 609 605 lp->stats.tx_errors++; 610 606 if (tx_status & 611 607 (TX_STATUS_EX_COLL << TX_STAT_CTL_STATUS_SHF)) 612 - lp->stats.tx_aborted_errors++; 608 + lp->stats.tx_aborted_errors++; 613 609 if (tx_status & 614 - (TX_STATUS_LATE_COLL << 615 - TX_STAT_CTL_STATUS_SHF)) lp->stats. 616 - tx_window_errors++; 610 + (TX_STATUS_LATE_COLL << TX_STAT_CTL_STATUS_SHF)) 611 + lp->stats.tx_window_errors++; 617 612 if (tx_status & 618 613 (TX_STATUS_L_CARR << TX_STAT_CTL_STATUS_SHF)) 619 - lp->stats.tx_carrier_errors++; 614 + lp->stats.tx_carrier_errors++; 620 615 if (tx_status & 621 616 (TX_STATUS_UNDER << TX_STAT_CTL_STATUS_SHF)) 622 - lp->stats.tx_fifo_errors++; 617 + lp->stats.tx_fifo_errors++; 623 618 if (tx_status & 624 619 (TX_STATUS_SQ_ERR << TX_STAT_CTL_STATUS_SHF)) 625 - lp->stats.tx_heartbeat_errors++; 620 + lp->stats.tx_heartbeat_errors++; 626 621 627 622 lp->stats.collisions += 628 - tx_status & TX_STATUS_TX_COLL_MSK; 623 + tx_status & TX_STATUS_TX_COLL_MSK; 629 624 } 630 625 631 626 /* Free buffer. */ ··· 639 636 } 640 637 } 641 638 642 - /* Make sure A and B are available to hardware. */ 643 - OUTL(OK2USE_TX_A | OK2USE_TX_B, &lp->lan_saa9730_regs->Ok2Use); 644 - 645 - if (netif_queue_stopped(dev)) { 646 - /* The tx buffer is no longer full. */ 647 - netif_wake_queue(dev); 648 - } 639 + /* The tx buffer is no longer full. */ 640 + netif_wake_queue(dev); 649 641 650 642 return 0; 651 643 } 652 644 653 645 static int lan_saa9730_rx(struct net_device *dev) 654 646 { 655 - struct lan_saa9730_private *lp = 656 - (struct lan_saa9730_private *) dev->priv; 647 + struct lan_saa9730_private *lp = netdev_priv(dev); 657 648 int len = 0; 658 649 struct sk_buff *skb = 0; 659 650 unsigned int rx_status; ··· 660 663 printk("lan_saa9730_rx interrupt\n"); 661 664 662 665 /* Clear receive interrupts. */ 663 - OUTL(DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT | 666 + outl(DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT | 664 667 DMA_STATUS_RX_TO_INT, &lp->lan_saa9730_regs->DmaStatus); 665 668 666 669 /* Address next packet */ 667 - if (lp->NextRcvToUseIsA) 668 - BufferIndex = 0; 669 - else 670 - BufferIndex = 1; 670 + BufferIndex = lp->NextRcvBufferIndex; 671 671 PacketIndex = lp->NextRcvPacketIndex; 672 - pPacket = (unsigned int *) lp->RcvBuffer[BufferIndex][PacketIndex]; 672 + pPacket = lp->RcvBuffer[BufferIndex][PacketIndex]; 673 673 rx_status = le32_to_cpu(*pPacket); 674 674 675 675 /* Process each packet. */ ··· 709 715 lp->stats.rx_errors++; 710 716 if (rx_status & 711 717 (RX_STATUS_CRC_ERR << RX_STAT_CTL_STATUS_SHF)) 712 - lp->stats.rx_crc_errors++; 718 + lp->stats.rx_crc_errors++; 713 719 if (rx_status & 714 - (RX_STATUS_ALIGN_ERR << 715 - RX_STAT_CTL_STATUS_SHF)) lp->stats. 716 - rx_frame_errors++; 720 + (RX_STATUS_ALIGN_ERR << RX_STAT_CTL_STATUS_SHF)) 721 + lp->stats.rx_frame_errors++; 717 722 if (rx_status & 718 723 (RX_STATUS_OVERFLOW << RX_STAT_CTL_STATUS_SHF)) 719 - lp->stats.rx_fifo_errors++; 724 + lp->stats.rx_fifo_errors++; 720 725 if (rx_status & 721 726 (RX_STATUS_LONG_ERR << RX_STAT_CTL_STATUS_SHF)) 722 - lp->stats.rx_length_errors++; 727 + lp->stats.rx_length_errors++; 723 728 } 724 729 725 730 /* Indicate we have processed the buffer. */ 726 - *pPacket = 727 - cpu_to_le32(RXSF_READY << RX_STAT_CTL_OWNER_SHF); 731 + *pPacket = cpu_to_le32(RXSF_READY << RX_STAT_CTL_OWNER_SHF); 732 + 733 + /* Make sure A or B is available to hardware as appropriate. */ 734 + outl(BufferIndex ? OK2USE_RX_B : OK2USE_RX_A, 735 + &lp->lan_saa9730_regs->Ok2Use); 728 736 729 737 /* Go to next packet in sequence. */ 730 738 lp->NextRcvPacketIndex++; 731 739 if (lp->NextRcvPacketIndex >= LAN_SAA9730_RCV_Q_SIZE) { 732 740 lp->NextRcvPacketIndex = 0; 733 - if (BufferIndex) { 734 - lp->NextRcvToUseIsA = 1; 735 - } else { 736 - lp->NextRcvToUseIsA = 0; 737 - } 741 + lp->NextRcvBufferIndex ^= 1; 738 742 } 739 - OUTL(OK2USE_RX_A | OK2USE_RX_B, 740 - &lp->lan_saa9730_regs->Ok2Use); 741 743 742 744 /* Address next packet */ 743 - if (lp->NextRcvToUseIsA) 744 - BufferIndex = 0; 745 - else 746 - BufferIndex = 1; 745 + BufferIndex = lp->NextRcvBufferIndex; 747 746 PacketIndex = lp->NextRcvPacketIndex; 748 - pPacket = 749 - (unsigned int *) lp-> 750 - RcvBuffer[BufferIndex][PacketIndex]; 747 + pPacket = lp->RcvBuffer[BufferIndex][PacketIndex]; 751 748 rx_status = le32_to_cpu(*pPacket); 752 749 } 753 - 754 - /* Make sure A and B are available to hardware. */ 755 - OUTL(OK2USE_RX_A | OK2USE_RX_B, &lp->lan_saa9730_regs->Ok2Use); 756 750 757 751 return 0; 758 752 } ··· 749 767 struct pt_regs *regs) 750 768 { 751 769 struct net_device *dev = (struct net_device *) dev_id; 752 - struct lan_saa9730_private *lp = 753 - (struct lan_saa9730_private *) dev->priv; 770 + struct lan_saa9730_private *lp = netdev_priv(dev); 754 771 755 772 if (lan_saa9730_debug > 5) 756 773 printk("lan_saa9730_interrupt\n"); ··· 761 780 evm_saa9730_clear_lan_int(lp); 762 781 763 782 /* Service pending transmit interrupts. */ 764 - if (INL(&lp->lan_saa9730_regs->DmaStatus) & DMA_STATUS_MAC_TX_INT) 783 + if (readl(&lp->lan_saa9730_regs->DmaStatus) & DMA_STATUS_MAC_TX_INT) 765 784 lan_saa9730_tx(dev); 766 785 767 786 /* Service pending receive interrupts. */ 768 - if (INL(&lp->lan_saa9730_regs->DmaStatus) & 787 + if (readl(&lp->lan_saa9730_regs->DmaStatus) & 769 788 (DMA_STATUS_MAC_RX_INT | DMA_STATUS_RX_INT | 770 789 DMA_STATUS_RX_TO_INT)) lan_saa9730_rx(dev); 771 790 ··· 775 794 return IRQ_HANDLED; 776 795 } 777 796 778 - static int lan_saa9730_open_fail(struct net_device *dev) 779 - { 780 - return -ENODEV; 781 - } 782 - 783 797 static int lan_saa9730_open(struct net_device *dev) 784 798 { 785 - struct lan_saa9730_private *lp = 786 - (struct lan_saa9730_private *) dev->priv; 799 + struct lan_saa9730_private *lp = netdev_priv(dev); 787 800 788 801 /* Associate IRQ with lan_saa9730_interrupt */ 789 802 if (request_irq(dev->irq, &lan_saa9730_interrupt, 0, "SAA9730 Eth", ··· 809 834 int PacketIndex; 810 835 811 836 if (lan_saa9730_debug > 5) 812 - printk("lan_saa9730_write: skb=%08x\n", 813 - (unsigned int) skb); 837 + printk("lan_saa9730_write: skb=%p\n", skb); 814 838 815 839 BufferIndex = lp->NextTxmBufferIndex; 816 840 PacketIndex = lp->NextTxmPacketIndex; 817 841 818 - tx_status = 819 - le32_to_cpu(*(unsigned int *) lp-> 820 - TxmBuffer[BufferIndex][PacketIndex]); 842 + tx_status = le32_to_cpu(*(unsigned int *)lp->TxmBuffer[BufferIndex] 843 + [PacketIndex]); 821 844 if ((tx_status & TX_STAT_CTL_OWNER_MSK) != 822 845 (TXSF_EMPTY << TX_STAT_CTL_OWNER_SHF)) { 823 846 if (lan_saa9730_debug > 4) ··· 831 858 lp->NextTxmBufferIndex ^= 1; 832 859 } 833 860 834 - pbPacketData = 835 - (unsigned char *) lp->TxmBuffer[BufferIndex][PacketIndex]; 861 + pbPacketData = lp->TxmBuffer[BufferIndex][PacketIndex]; 836 862 pbPacketData += 4; 837 863 838 864 /* copy the bits */ 839 865 memcpy(pbPacketData, pbData, len); 840 866 841 867 /* Set transmit status for hardware */ 842 - *(unsigned int *) lp->TxmBuffer[BufferIndex][PacketIndex] = 843 - cpu_to_le32((TXSF_READY << TX_STAT_CTL_OWNER_SHF) | 844 - (TX_STAT_CTL_INT_AFTER_TX << TX_STAT_CTL_FRAME_SHF) 845 - | (len << TX_STAT_CTL_LENGTH_SHF)); 868 + *(unsigned int *)lp->TxmBuffer[BufferIndex][PacketIndex] = 869 + cpu_to_le32((TXSF_READY << TX_STAT_CTL_OWNER_SHF) | 870 + (TX_STAT_CTL_INT_AFTER_TX << 871 + TX_STAT_CTL_FRAME_SHF) | 872 + (len << TX_STAT_CTL_LENGTH_SHF)); 846 873 847 - /* Set hardware tx buffer. */ 848 - OUTL(OK2USE_TX_A | OK2USE_TX_B, &lp->lan_saa9730_regs->Ok2Use); 874 + /* Make sure A or B is available to hardware as appropriate. */ 875 + outl(BufferIndex ? OK2USE_TX_B : OK2USE_TX_A, 876 + &lp->lan_saa9730_regs->Ok2Use); 849 877 850 878 return 0; 851 879 } 852 880 853 881 static void lan_saa9730_tx_timeout(struct net_device *dev) 854 882 { 855 - struct lan_saa9730_private *lp = 856 - (struct lan_saa9730_private *) dev->priv; 883 + struct lan_saa9730_private *lp = netdev_priv(dev); 857 884 858 885 /* Transmitter timeout, serious problems */ 859 886 lp->stats.tx_errors++; ··· 862 889 lan_saa9730_restart(lp); 863 890 864 891 dev->trans_start = jiffies; 865 - netif_start_queue(dev); 892 + netif_wake_queue(dev); 866 893 } 867 894 868 895 static int lan_saa9730_start_xmit(struct sk_buff *skb, 869 896 struct net_device *dev) 870 897 { 871 - struct lan_saa9730_private *lp = 872 - (struct lan_saa9730_private *) dev->priv; 898 + struct lan_saa9730_private *lp = netdev_priv(dev); 873 899 unsigned long flags; 874 900 int skblen; 875 901 int len; 876 902 877 903 if (lan_saa9730_debug > 4) 878 - printk("Send packet: skb=%08x\n", (unsigned int) skb); 904 + printk("Send packet: skb=%p\n", skb); 879 905 880 906 skblen = skb->len; 881 907 ··· 884 912 885 913 if (lan_saa9730_write(lp, skb, skblen)) { 886 914 spin_unlock_irqrestore(&lp->lock, flags); 887 - printk("Error when writing packet to controller: skb=%08x\n", 888 - (unsigned int) skb); 915 + printk("Error when writing packet to controller: skb=%p\n", skb); 889 916 netif_stop_queue(dev); 890 917 return -1; 891 918 } ··· 893 922 lp->stats.tx_packets++; 894 923 895 924 dev->trans_start = jiffies; 896 - netif_start_queue(dev); 925 + netif_wake_queue(dev); 897 926 dev_kfree_skb(skb); 898 927 899 928 spin_unlock_irqrestore(&lp->lock, flags); ··· 903 932 904 933 static int lan_saa9730_close(struct net_device *dev) 905 934 { 906 - struct lan_saa9730_private *lp = 907 - (struct lan_saa9730_private *) dev->priv; 935 + struct lan_saa9730_private *lp = netdev_priv(dev); 908 936 909 937 if (lan_saa9730_debug > 1) 910 938 printk("lan_saa9730_close:\n"); ··· 925 955 static struct net_device_stats *lan_saa9730_get_stats(struct net_device 926 956 *dev) 927 957 { 928 - struct lan_saa9730_private *lp = 929 - (struct lan_saa9730_private *) dev->priv; 958 + struct lan_saa9730_private *lp = netdev_priv(dev); 930 959 931 960 return &lp->stats; 932 961 } 933 962 934 963 static void lan_saa9730_set_multicast(struct net_device *dev) 935 964 { 936 - struct lan_saa9730_private *lp = 937 - (struct lan_saa9730_private *) dev->priv; 965 + struct lan_saa9730_private *lp = netdev_priv(dev); 938 966 939 967 /* Stop the controller */ 940 968 lan_saa9730_stop(lp); 941 969 942 970 if (dev->flags & IFF_PROMISC) { 943 971 /* accept all packets */ 944 - OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_STATION_ACC | 972 + outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_STATION_ACC | 945 973 CAM_CONTROL_GROUP_ACC | CAM_CONTROL_BROAD_ACC, 946 974 &lp->lan_saa9730_regs->CamCtl); 947 975 } else { 948 976 if (dev->flags & IFF_ALLMULTI) { 949 977 /* accept all multicast packets */ 950 - OUTL(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC | 978 + outl(CAM_CONTROL_COMP_EN | CAM_CONTROL_GROUP_ACC | 951 979 CAM_CONTROL_BROAD_ACC, 952 980 &lp->lan_saa9730_regs->CamCtl); 953 981 } else { ··· 962 994 static void __devexit saa9730_remove_one(struct pci_dev *pdev) 963 995 { 964 996 struct net_device *dev = pci_get_drvdata(pdev); 997 + struct lan_saa9730_private *lp = netdev_priv(dev); 965 998 966 999 if (dev) { 967 1000 unregister_netdev(dev); 968 - kfree(dev->priv); 1001 + lan_saa9730_free_buffers(pdev, lp); 1002 + iounmap(lp->lan_saa9730_regs); 1003 + iounmap(lp->evm_saa9730_regs); 969 1004 free_netdev(dev); 970 1005 pci_release_regions(pdev); 971 1006 pci_disable_device(pdev); ··· 977 1006 } 978 1007 979 1008 980 - static int lan_saa9730_init(struct net_device *dev, int ioaddr, int irq) 1009 + static int lan_saa9730_init(struct net_device *dev, struct pci_dev *pdev, 1010 + unsigned long ioaddr, int irq) 981 1011 { 982 - struct lan_saa9730_private *lp; 1012 + struct lan_saa9730_private *lp = netdev_priv(dev); 983 1013 unsigned char ethernet_addr[6]; 984 - int ret = 0; 1014 + int ret; 985 1015 986 - dev->open = lan_saa9730_open_fail; 987 - 988 - if (get_ethernet_addr(ethernet_addr)) 989 - return -ENODEV; 1016 + if (get_ethernet_addr(ethernet_addr)) { 1017 + ret = -ENODEV; 1018 + goto out; 1019 + } 990 1020 991 1021 memcpy(dev->dev_addr, ethernet_addr, 6); 992 1022 dev->base_addr = ioaddr; 993 1023 dev->irq = irq; 994 1024 995 - /* 996 - * Make certain the data structures used by the controller are aligned 997 - * and DMAble. 998 - */ 999 - /* 1000 - * XXX: that is obviously broken - kfree() won't be happy with us. 1001 - */ 1002 - lp = (struct lan_saa9730_private *) (((unsigned long) 1003 - kmalloc(sizeof(*lp) + 7, 1004 - GFP_DMA | GFP_KERNEL) 1005 - + 7) & ~7); 1006 - 1007 - if (!lp) 1008 - return -ENOMEM; 1009 - 1010 - dev->priv = lp; 1011 - memset(lp, 0, sizeof(*lp)); 1025 + lp->pci_dev = pdev; 1012 1026 1013 1027 /* Set SAA9730 LAN base address. */ 1014 - lp->lan_saa9730_regs = (t_lan_saa9730_regmap *) (ioaddr + 1015 - SAA9730_LAN_REGS_ADDR); 1028 + lp->lan_saa9730_regs = ioremap(ioaddr + SAA9730_LAN_REGS_ADDR, 1029 + SAA9730_LAN_REGS_SIZE); 1030 + if (!lp->lan_saa9730_regs) { 1031 + ret = -ENOMEM; 1032 + goto out; 1033 + } 1016 1034 1017 1035 /* Set SAA9730 EVM base address. */ 1018 - lp->evm_saa9730_regs = (t_evm_saa9730_regmap *) (ioaddr + 1019 - SAA9730_EVM_REGS_ADDR); 1036 + lp->evm_saa9730_regs = ioremap(ioaddr + SAA9730_EVM_REGS_ADDR, 1037 + SAA9730_EVM_REGS_SIZE); 1038 + if (!lp->evm_saa9730_regs) { 1039 + ret = -ENOMEM; 1040 + goto out_iounmap_lan; 1041 + } 1020 1042 1021 1043 /* Allocate LAN RX/TX frame buffer space. */ 1022 - /* FIXME: a leak */ 1023 - if ((ret = lan_saa9730_allocate_buffers(lp))) 1024 - goto out; 1044 + if ((ret = lan_saa9730_allocate_buffers(pdev, lp))) 1045 + goto out_iounmap; 1025 1046 1026 1047 /* Stop LAN controller. */ 1027 1048 if ((ret = lan_saa9730_stop(lp))) 1028 - goto out; 1049 + goto out_free_consistent; 1029 1050 1030 1051 /* Initialize CAM registers. */ 1031 1052 if ((ret = lan_saa9730_cam_init(dev))) 1032 - goto out; 1053 + goto out_free_consistent; 1033 1054 1034 1055 /* Initialize MII registers. */ 1035 1056 if ((ret = lan_saa9730_mii_init(lp))) 1036 - goto out; 1057 + goto out_free_consistent; 1037 1058 1038 1059 /* Initialize control registers. */ 1039 1060 if ((ret = lan_saa9730_control_init(lp))) 1040 - goto out; 1061 + goto out_free_consistent; 1041 1062 1042 1063 /* Load CAM registers. */ 1043 1064 if ((ret = lan_saa9730_cam_load(lp))) 1044 - goto out; 1065 + goto out_free_consistent; 1045 1066 1046 1067 /* Initialize DMA context registers. */ 1047 1068 if ((ret = lan_saa9730_dma_init(lp))) 1048 - goto out; 1069 + goto out_free_consistent; 1049 1070 1050 1071 spin_lock_init(&lp->lock); 1051 1072 ··· 1050 1087 dev->watchdog_timeo = (HZ >> 1); 1051 1088 dev->dma = 0; 1052 1089 1053 - ret = register_netdev(dev); 1090 + ret = register_netdev (dev); 1054 1091 if (ret) 1055 - goto out; 1092 + goto out_free_consistent; 1093 + 1056 1094 return 0; 1057 1095 1058 - out: 1059 - kfree(dev->priv); 1096 + out_free_consistent: 1097 + lan_saa9730_free_buffers(pdev, lp); 1098 + out_iounmap: 1099 + iounmap(lp->evm_saa9730_regs); 1100 + out_iounmap_lan: 1101 + iounmap(lp->lan_saa9730_regs); 1102 + out: 1060 1103 return ret; 1061 1104 } 1062 1105 1063 1106 1064 1107 static int __devinit saa9730_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 1065 1108 { 1066 - struct net_device *dev; 1067 - unsigned int pci_ioaddr; 1109 + struct net_device *dev = NULL; 1110 + unsigned long pci_ioaddr; 1068 1111 int err; 1069 1112 1070 1113 if (lan_saa9730_debug > 1) 1071 1114 printk("saa9730.c: PCI bios is present, checking for devices...\n"); 1072 1115 1073 - err = -ENOMEM; 1074 - dev = alloc_etherdev(0); 1075 - if (!dev) 1076 - goto out; 1077 - 1078 - SET_MODULE_OWNER(dev); 1079 - 1080 1116 err = pci_enable_device(pdev); 1081 1117 if (err) { 1082 1118 printk(KERN_ERR "Cannot enable PCI device, aborting.\n"); 1083 - goto out1; 1119 + goto out; 1084 1120 } 1085 1121 1086 1122 err = pci_request_regions(pdev, DRV_MODULE_NAME); 1087 1123 if (err) { 1088 1124 printk(KERN_ERR "Cannot obtain PCI resources, aborting.\n"); 1089 - goto out2; 1125 + goto out_disable_pdev; 1090 1126 } 1091 1127 1092 1128 pci_irq_line = pdev->irq; ··· 1094 1132 pci_ioaddr = pci_resource_start(pdev, 1); 1095 1133 pci_set_master(pdev); 1096 1134 1097 - printk("Found SAA9730 (PCI) at %#x, irq %d.\n", 1135 + printk("Found SAA9730 (PCI) at %lx, irq %d.\n", 1098 1136 pci_ioaddr, pci_irq_line); 1099 1137 1100 - err = lan_saa9730_init(dev, pci_ioaddr, pci_irq_line); 1138 + dev = alloc_etherdev(sizeof(struct lan_saa9730_private)); 1139 + if (!dev) 1140 + goto out_disable_pdev; 1141 + 1142 + err = lan_saa9730_init(dev, pdev, pci_ioaddr, pci_irq_line); 1101 1143 if (err) { 1102 - printk("Lan init failed"); 1103 - goto out2; 1144 + printk("LAN init failed"); 1145 + goto out_free_netdev; 1104 1146 } 1105 1147 1106 1148 pci_set_drvdata(pdev, dev); 1107 1149 SET_NETDEV_DEV(dev, &pdev->dev); 1108 1150 return 0; 1109 1151 1110 - out2: 1111 - pci_disable_device(pdev); 1112 - out1: 1152 + out_free_netdev: 1113 1153 free_netdev(dev); 1154 + out_disable_pdev: 1155 + pci_disable_device(pdev); 1114 1156 out: 1157 + pci_set_drvdata(pdev, NULL); 1115 1158 return err; 1116 1159 } 1117 1160 ··· 1142 1175 module_init(saa9730_init); 1143 1176 module_exit(saa9730_cleanup); 1144 1177 1145 - 1146 - 1178 + MODULE_AUTHOR("Ralf Baechle <ralf@linux-mips.org>"); 1179 + MODULE_DESCRIPTION("Philips SAA9730 ethernet driver"); 1147 1180 MODULE_LICENSE("GPL");