diff options
author | Dhananjay Phadke <dhananjay@netxen.com> | 2009-08-24 15:23:26 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-08-26 18:29:17 -0400 |
commit | c9517e5893db03ca8bd32b8783b39af58176947c (patch) | |
tree | 5ae4d26af6f38e70a868e634d0576056c326027e /drivers/net/netxen/netxen_nic_init.c | |
parent | cb7e4b6e37144f5d131ee09296be3c21c41f28d8 (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.c | 52 |
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 | ||
372 | static long rom_max_timeout = 100; | 372 | #define NETXEN_MAX_ROM_WAIT_USEC 100 |
373 | static long rom_lock_timeout = 10000; | ||
374 | |||
375 | static 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 | ||
404 | static int netxen_wait_rom_done(struct netxen_adapter *adapter) | 374 | static 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 | ||
423 | static void netxen_rom_unlock(struct netxen_adapter *adapter) | ||
424 | { | ||
425 | /* release semaphore2 */ | ||
426 | NXRD32(adapter, NETXEN_PCIE_REG(PCIE_SEM2_UNLOCK)); | ||
427 | |||
428 | } | ||
429 | |||
430 | static int do_rom_fast_read(struct netxen_adapter *adapter, | 394 | static 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 | ||