aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_init.c
diff options
context:
space:
mode:
authorDhananjay Phadke <dhananjay@netxen.com>2009-08-24 15:23:26 -0400
committerDavid S. Miller <davem@davemloft.net>2009-08-26 18:29:17 -0400
commitc9517e5893db03ca8bd32b8783b39af58176947c (patch)
tree5ae4d26af6f38e70a868e634d0576056c326027e /drivers/net/netxen/netxen_nic_init.c
parentcb7e4b6e37144f5d131ee09296be3c21c41f28d8 (diff)
netxen: implement generic pcie semaphore functions
Implement common function for locking/unlocking 8 hardware semaphores used for serializing access to shared resouces on a NIC board by different PCI functions. As by definition, callers of these semaphore API can be put to sleep till the semaphore is locked. Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/netxen/netxen_nic_init.c')
-rw-r--r--drivers/net/netxen/netxen_nic_init.c52
1 files changed, 8 insertions, 44 deletions
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index f5807dae09e9..313cd261b2b0 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -369,37 +369,7 @@ static u32 netxen_decode_crb_addr(u32 addr)
369 return (pci_base + offset); 369 return (pci_base + offset);
370} 370}
371 371
372static long rom_max_timeout = 100; 372#define NETXEN_MAX_ROM_WAIT_USEC 100
373static long rom_lock_timeout = 10000;
374
375static int rom_lock(struct netxen_adapter *adapter)
376{
377 int iter;
378 u32 done = 0;
379 int timeout = 0;
380
381 while (!done) {
382 /* acquire semaphore2 from PCI HW block */
383 done = NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM2_LOCK));
384 if (done == 1)
385 break;
386 if (timeout >= rom_lock_timeout)
387 return -EIO;
388
389 timeout++;
390 /*
391 * Yield CPU
392 */
393 if (!in_atomic())
394 schedule();
395 else {
396 for (iter = 0; iter < 20; iter++)
397 cpu_relax(); /*This a nop instr on i386 */
398 }
399 }
400 NXWR32(adapter, NETXEN_ROM_LOCK_ID, ROM_LOCK_DRIVER);
401 return 0;
402}
403 373
404static int netxen_wait_rom_done(struct netxen_adapter *adapter) 374static int netxen_wait_rom_done(struct netxen_adapter *adapter)
405{ 375{
@@ -411,22 +381,16 @@ static int netxen_wait_rom_done(struct netxen_adapter *adapter)
411 while (done == 0) { 381 while (done == 0) {
412 done = NXRD32(adapter, NETXEN_ROMUSB_GLB_STATUS); 382 done = NXRD32(adapter, NETXEN_ROMUSB_GLB_STATUS);
413 done &= 2; 383 done &= 2;
414 timeout++; 384 if (++timeout >= NETXEN_MAX_ROM_WAIT_USEC) {
415 if (timeout >= rom_max_timeout) { 385 dev_err(&adapter->pdev->dev,
416 printk("Timeout reached waiting for rom done"); 386 "Timeout reached waiting for rom done");
417 return -EIO; 387 return -EIO;
418 } 388 }
389 udelay(1);
419 } 390 }
420 return 0; 391 return 0;
421} 392}
422 393
423static void netxen_rom_unlock(struct netxen_adapter *adapter)
424{
425 /* release semaphore2 */
426 NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM2_UNLOCK));
427
428}
429
430static int do_rom_fast_read(struct netxen_adapter *adapter, 394static int do_rom_fast_read(struct netxen_adapter *adapter,
431 int addr, int *valp) 395 int addr, int *valp)
432{ 396{
@@ -471,7 +435,7 @@ netxen_rom_fast_read_words(struct netxen_adapter *adapter, int addr,
471{ 435{
472 int ret; 436 int ret;
473 437
474 ret = rom_lock(adapter); 438 ret = netxen_rom_lock(adapter);
475 if (ret < 0) 439 if (ret < 0)
476 return ret; 440 return ret;
477 441
@@ -485,7 +449,7 @@ int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
485{ 449{
486 int ret; 450 int ret;
487 451
488 if (rom_lock(adapter) != 0) 452 if (netxen_rom_lock(adapter) != 0)
489 return -EIO; 453 return -EIO;
490 454
491 ret = do_rom_fast_read(adapter, addr, valp); 455 ret = do_rom_fast_read(adapter, addr, valp);
@@ -506,7 +470,7 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
506 u32 off; 470 u32 off;
507 471
508 /* resetall */ 472 /* resetall */
509 rom_lock(adapter); 473 netxen_rom_lock(adapter);
510 NXWR32(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 0xffffffff); 474 NXWR32(adapter, NETXEN_ROMUSB_GLB_SW_RESET, 0xffffffff);
511 netxen_rom_unlock(adapter); 475 netxen_rom_unlock(adapter);
512 476