[Linux1394-cvslog] rev 607 - trunk
Brought to you by:
aeb,
bencollins
From: SVN U. <ben...@li...> - 2002-10-13 18:33:57
|
Author: bencollins Date: 2002-10-13 14:33:50 -0400 (Sun, 13 Oct 2002) New Revision: 607 Modified: trunk/eth1394.c trunk/ieee1394_core.c trunk/ieee1394_core.h trunk/raw1394.c trunk/raw1394.h trunk/sbp2.c trunk/sbp2.h Log: Convert our packet complete queue to an internal implementation that doesn't depend on tqueue or workqueue. For one, this didn't really fit into either case. TQueue handled it, but workqueue doesn't. I had broken this setup, because we are not supposed to return until process_packet_complete executes all the complete tasks. Modified: trunk/ieee1394_core.c ============================================================================== --- trunk/ieee1394_core.c (original) +++ trunk/ieee1394_core.c 2002-10-13 14:33:52.000000000 -0400 @@ -80,11 +80,14 @@ { struct list_head *lh, *next; - list_for_each_safe(lh, next, &packet->complete_tq) { - struct hpsb_queue_struct *tq = - list_entry(lh, struct hpsb_queue_struct, hpsb_queue_list); - list_del(&tq->hpsb_queue_list); - hpsb_schedule_work(tq); + list_for_each_safe(lh, next, &packet->complete_work) { + struct hpsb_packet_work *work = + list_entry(lh, struct hpsb_packet_work, list); + + list_del(&work->list); + + if (work->routine) + work->routine(work->data); } return; @@ -93,11 +96,11 @@ /** * hpsb_add_packet_complete_task - add a new task for when a packet completes * @packet: the packet whose completion we want the task added to - * @tq: the hpsb_queue_struct describing the task to add + * @work: the hpsb_queue_struct describing the task to add */ -void hpsb_add_packet_complete_task(struct hpsb_packet *packet, struct hpsb_queue_struct *tq) +void hpsb_add_packet_complete_task(struct hpsb_packet *packet, struct hpsb_packet_work *work) { - list_add_tail(&tq->hpsb_queue_list, &packet->complete_tq); + list_add_tail(&work->list, &packet->complete_work); return; } @@ -145,7 +148,7 @@ packet->data_size = data_size; } - INIT_LIST_HEAD(&packet->complete_tq); + INIT_LIST_HEAD(&packet->complete_work); INIT_LIST_HEAD(&packet->list); sema_init(&packet->state_change, 0); packet->state = hpsb_unused; Modified: trunk/ieee1394_core.h ============================================================================== --- trunk/ieee1394_core.h (original) +++ trunk/ieee1394_core.h 2002-10-13 14:33:52.000000000 -0400 @@ -68,7 +68,7 @@ /* Very core internal, don't care. */ struct semaphore state_change; - struct list_head complete_tq; + struct list_head complete_work; /* Store jiffies for implementing bus timeouts. */ unsigned long sendtime; @@ -76,8 +76,31 @@ quadlet_t embedded_header[5]; }; -/* add a new task for when a packet completes */ -void hpsb_add_packet_complete_task(struct hpsb_packet *packet, struct hpsb_queue_struct *tq); +/* TODO: When we drop 2.4.x support into it's own branch, I want to complete + * switch this over to a workqueue interface somehow. -- BenC */ + +/* Used to pass a function/arg that is called when a packet completes */ +struct hpsb_packet_work { + struct list_head list; /* linked list of active bh's */ + void (*routine)(void *); /* function to call */ + void *data; /* argument to function */ +}; + +#define HPSB_PACKET_WORK_INIT(_work, _routine, _data) \ +do { \ + INIT_LIST_HEAD(&(_work)->list); \ + HPSB_PACKET_WORK_PREPARE((_work), (_routine), (_data)); \ +} while (0) + +#define HPSB_PACKET_WORK_PREPARE(_work, _routine, _data) \ +do { \ + (_work)->routine = _routine; \ + (_work)->data = _data; \ +} while (0) + + +/* Add a new task for when a packet completes */ +void hpsb_add_packet_complete_task(struct hpsb_packet *packet, struct hpsb_packet_work *work); static inline struct hpsb_packet *driver_packet(struct list_head *l) { Modified: trunk/raw1394.c ============================================================================== --- trunk/raw1394.c (original) +++ trunk/raw1394.c 2002-10-13 14:33:52.000000000 -0400 @@ -107,7 +107,8 @@ if (req != NULL) { memset(req, 0, sizeof(struct pending_request)); INIT_LIST_HEAD(&req->list); - HPSB_INIT_WORK(&req->tq, (void(*)(void*))queue_complete_cb, NULL); + HPSB_PACKET_WORK_INIT(&req->work, + (void(*)(void*))queue_complete_cb, req); } return req; @@ -753,8 +754,7 @@ return sizeof(struct raw1394_request); } - req->tq.data = req; - hpsb_add_packet_complete_task(packet, &req->tq); + hpsb_add_packet_complete_task(packet, &req->work); spin_lock_irq(&fi->reqlists_lock); list_add_tail(&req->list, &fi->req_pending); @@ -794,9 +794,10 @@ return sizeof(struct raw1394_request); } - HPSB_PREPARE_WORK(&req->tq, (void (*)(void*))queue_complete_req, req); + HPSB_PACKET_WORK_PREPARE(&req->work, + (void (*)(void*))queue_complete_req, req); req->req.length = 0; - hpsb_add_packet_complete_task(packet, &req->tq); + hpsb_add_packet_complete_task(packet, &req->work); spin_lock_irq(&fi->reqlists_lock); list_add_tail(&req->list, &fi->req_pending); @@ -857,9 +858,10 @@ packet->header_size=header_length; packet->data_size=req->req.length-header_length; - HPSB_PREPARE_WORK(&req->tq, (void (*)(void*))queue_complete_req, req); + HPSB_PACKET_WORK_PREPARE(&req->work, + (void (*)(void*))queue_complete_req, req); req->req.length = 0; - hpsb_add_packet_complete_task(packet, &req->tq); + hpsb_add_packet_complete_task(packet, &req->work); spin_lock_irq(&fi->reqlists_lock); list_add_tail(&req->list, &fi->req_pending); @@ -1806,8 +1808,7 @@ if (!packet) return -ENOMEM; req->req.length=0; req->packet=packet; - req->tq.data=req; - hpsb_add_packet_complete_task(packet, &req->tq); + hpsb_add_packet_complete_task(packet, &req->work); spin_lock_irq(&fi->reqlists_lock); list_add_tail(&req->list, &fi->req_pending); spin_unlock_irq(&fi->reqlists_lock); Modified: trunk/raw1394.h ============================================================================== --- trunk/raw1394.h (original) +++ trunk/raw1394.h 2002-10-13 14:33:52.000000000 -0400 @@ -164,7 +164,7 @@ struct list_head list; struct file_info *file_info; struct hpsb_packet *packet; - struct hpsb_queue_struct tq; + struct hpsb_packet_work work; struct iso_block_store *ibs; quadlet_t *data; int free_data; Modified: trunk/eth1394.c ============================================================================== --- trunk/eth1394.c (original) +++ trunk/eth1394.c 2002-10-13 14:33:52.000000000 -0400 @@ -682,6 +682,8 @@ ptask->skb = skb; ptask->addr = addr; ptask->dest_node = dest_node; + /* TODO: When 2.4 is out of the way, give each of our ethernet + * dev's a workqueue to handle these. */ HPSB_INIT_WORK(&ptask->tq, hpsb_write_sched, ptask); hpsb_schedule_work(&ptask->tq); Modified: trunk/sbp2.c ============================================================================== --- trunk/sbp2.c (original) +++ trunk/sbp2.c 2002-10-13 14:33:52.000000000 -0400 @@ -705,6 +705,14 @@ */ INIT_LIST_HEAD(&hi->request_packet[i].list); hi->request_packet[i].packet = packet; + /* + * Set up a task queue completion routine, which returns + * the packet to the free list and releases the tlabel. + */ + HPSB_PACKET_WORK_INIT(&hi->request_packet[i].work, + (void (*)(void*))sbp2util_free_request_packet, + &hi->request_packet[i]); + list_add_tail(&hi->request_packet[i].list, &hi->sbp2_req_free); } @@ -797,15 +805,9 @@ fill_async_writeblock(packet, addr, data_size); } - /* - * Set up a task queue completion routine, which returns - * the packet to the free list and releases the tlabel. - */ - HPSB_PREPARE_WORK(&request_packet->tq, - (void (*)(void*))sbp2util_free_request_packet, - request_packet); request_packet->hi_context = hi; - hpsb_add_packet_complete_task(packet, &request_packet->tq); + /* Calls the packet completion to return this to the free list */ + hpsb_add_packet_complete_task(packet, &request_packet->work); /* * Now, put the packet on the in-use list. @@ -1376,7 +1378,12 @@ INIT_LIST_HEAD(&scsi_id->sbp2_command_orb_inuse); INIT_LIST_HEAD(&scsi_id->sbp2_command_orb_completed); scsi_id->sbp2_command_orb_lock = SPIN_LOCK_UNLOCKED; - scsi_id->sbp2_total_command_orbs = 0; + + /* Knock the total command orbs down if we are serializing I/O */ + if (sbp2_serialize_io) + scsi_id->sbp2_total_command_orbs = 2; + else + scsi_id->sbp2_total_command_orbs = SBP2_MAX_COMMAND_ORBS; /* * Make sure that we've gotten ahold of the sbp2 management agent @@ -1385,15 +1392,6 @@ */ sbp2_parse_unit_directory(scsi_id); - scsi_id->sbp2_total_command_orbs = SBP2_MAX_COMMAND_ORBS; - - /* - * Knock the total command orbs down if we are serializing I/O - */ - if (sbp2_serialize_io) { - scsi_id->sbp2_total_command_orbs = 2; /* one extra for good measure */ - } - /* * Find an empty spot to stick our scsi id instance data. */ Modified: trunk/sbp2.h ============================================================================== --- trunk/sbp2.h (original) +++ trunk/sbp2.h 2002-10-13 14:33:52.000000000 -0400 @@ -324,7 +324,7 @@ struct list_head list; struct hpsb_packet *packet; - struct hpsb_queue_struct tq; + struct hpsb_packet_work work; void *hi_context; }; |