X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fieee1394%2Fnodemgr.c;h=21472e9bdfa678711f19c1528d1518cffb3d67f5;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=1d22fe8479cb07a03697cb619df09399cc5e7f7a;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 1d22fe847..21472e9bd 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -69,8 +69,7 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length, if (!ret) break; - set_current_state(TASK_INTERRUPTIBLE); - if (schedule_timeout (HZ/3)) + if (msleep_interruptible(334)) return -EINTR; } @@ -1074,7 +1073,7 @@ do { \ #undef PUT_ENVP - envp[i] = 0; + envp[i] = NULL; return 0; } @@ -1474,19 +1473,28 @@ static int nodemgr_host_thread(void *__hi) /* Sit and wait for a signal to probe the nodes on the bus. This * happens when we get a bus reset. */ - while (!down_interruptible(&hi->reset_sem) && - !down_interruptible(&nodemgr_serialize)) { + while (1) { unsigned int generation = 0; int i; - if (hi->kill_me) + if (down_interruptible(&hi->reset_sem) || + down_interruptible(&nodemgr_serialize)) { + if (try_to_freeze(PF_FREEZE)) + continue; + printk("NodeMgr: received unexpected signal?!\n" ); break; + } + + if (hi->kill_me) { + up(&nodemgr_serialize); + break; + } /* Pause for 1/4 second in 1/16 second intervals, * to make sure things settle down. */ for (i = 0; i < 4 ; i++) { set_current_state(TASK_INTERRUPTIBLE); - if (schedule_timeout(HZ/16)) { + if (msleep_interruptible(63)) { up(&nodemgr_serialize); goto caught_signal; } @@ -1502,6 +1510,12 @@ static int nodemgr_host_thread(void *__hi) * start the the waiting over again */ while (!down_trylock(&hi->reset_sem)) i = 0; + + /* Check the kill_me again */ + if (hi->kill_me) { + up(&nodemgr_serialize); + goto caught_signal; + } } if (!nodemgr_check_irm_capability(host, reset_cycles)) { @@ -1702,12 +1716,23 @@ static struct hpsb_highlevel nodemgr_highlevel = { .remove_host = nodemgr_remove_host, }; -void init_ieee1394_nodemgr(void) +int init_ieee1394_nodemgr(void) { - class_register(&nodemgr_ne_class); - class_register(&nodemgr_ud_class); + int ret; + + ret = class_register(&nodemgr_ne_class); + if (ret < 0) + return ret; + + ret = class_register(&nodemgr_ud_class); + if (ret < 0) { + class_unregister(&nodemgr_ne_class); + return ret; + } hpsb_register_highlevel(&nodemgr_highlevel); + + return 0; } void cleanup_ieee1394_nodemgr(void)