diff options
| -rw-r--r-- | arch/powerpc/platforms/iseries/irq.c | 13 | ||||
| -rw-r--r-- | arch/powerpc/platforms/iseries/lpevents.c | 12 | ||||
| -rw-r--r-- | arch/powerpc/platforms/iseries/mf.c | 16 | ||||
| -rw-r--r-- | arch/powerpc/platforms/iseries/viopath.c | 12 | ||||
| -rw-r--r-- | drivers/block/viodasd.c | 32 | ||||
| -rw-r--r-- | drivers/cdrom/viocd.c | 6 | ||||
| -rw-r--r-- | drivers/char/viocons.c | 31 | ||||
| -rw-r--r-- | drivers/net/iseries_veth.c | 4 | ||||
| -rw-r--r-- | include/asm-powerpc/iseries/hv_lp_event.h | 41 |
9 files changed, 82 insertions, 85 deletions
diff --git a/arch/powerpc/platforms/iseries/irq.c b/arch/powerpc/platforms/iseries/irq.c index 42e978e4897a..3d023856405a 100644 --- a/arch/powerpc/platforms/iseries/irq.c +++ b/arch/powerpc/platforms/iseries/irq.c | |||
| @@ -147,20 +147,11 @@ static void int_received(struct pci_event *event, struct pt_regs *regs) | |||
| 147 | static void pci_event_handler(struct HvLpEvent *event, struct pt_regs *regs) | 147 | static void pci_event_handler(struct HvLpEvent *event, struct pt_regs *regs) |
| 148 | { | 148 | { |
| 149 | if (event && (event->xType == HvLpEvent_Type_PciIo)) { | 149 | if (event && (event->xType == HvLpEvent_Type_PciIo)) { |
| 150 | switch (event->xFlags.xFunction) { | 150 | if (hvlpevent_is_int(event)) |
| 151 | case HvLpEvent_Function_Int: | ||
| 152 | int_received((struct pci_event *)event, regs); | 151 | int_received((struct pci_event *)event, regs); |
| 153 | break; | 152 | else |
| 154 | case HvLpEvent_Function_Ack: | ||
| 155 | printk(KERN_ERR | 153 | printk(KERN_ERR |
| 156 | "pci_event_handler: unexpected ack received\n"); | 154 | "pci_event_handler: unexpected ack received\n"); |
| 157 | break; | ||
| 158 | default: | ||
| 159 | printk(KERN_ERR | ||
| 160 | "pci_event_handler: unexpected event function %d\n", | ||
| 161 | (int)event->xFlags.xFunction); | ||
| 162 | break; | ||
| 163 | } | ||
| 164 | } else if (event) | 155 | } else if (event) |
| 165 | printk(KERN_ERR | 156 | printk(KERN_ERR |
| 166 | "pci_event_handler: Unrecognized PCI event type 0x%x\n", | 157 | "pci_event_handler: Unrecognized PCI event type 0x%x\n", |
diff --git a/arch/powerpc/platforms/iseries/lpevents.c b/arch/powerpc/platforms/iseries/lpevents.c index e9fb98bf895f..0b885300d1d1 100644 --- a/arch/powerpc/platforms/iseries/lpevents.c +++ b/arch/powerpc/platforms/iseries/lpevents.c | |||
| @@ -53,7 +53,7 @@ static struct HvLpEvent * get_next_hvlpevent(void) | |||
| 53 | struct HvLpEvent * event; | 53 | struct HvLpEvent * event; |
| 54 | event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr; | 54 | event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr; |
| 55 | 55 | ||
| 56 | if (event->xFlags.xValid) { | 56 | if (hvlpevent_is_valid(event)) { |
| 57 | /* rmb() needed only for weakly consistent machines (regatta) */ | 57 | /* rmb() needed only for weakly consistent machines (regatta) */ |
| 58 | rmb(); | 58 | rmb(); |
| 59 | /* Set pointer to next potential event */ | 59 | /* Set pointer to next potential event */ |
| @@ -84,7 +84,7 @@ int hvlpevent_is_pending(void) | |||
| 84 | 84 | ||
| 85 | next_event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr; | 85 | next_event = (struct HvLpEvent *)hvlpevent_queue.xSlicCurEventPtr; |
| 86 | 86 | ||
| 87 | return next_event->xFlags.xValid | | 87 | return hvlpevent_is_valid(next_event) || |
| 88 | hvlpevent_queue.xPlicOverflowIntPending; | 88 | hvlpevent_queue.xPlicOverflowIntPending; |
| 89 | } | 89 | } |
| 90 | 90 | ||
| @@ -101,18 +101,18 @@ static void hvlpevent_clear_valid(struct HvLpEvent * event) | |||
| 101 | switch (extra) { | 101 | switch (extra) { |
| 102 | case 3: | 102 | case 3: |
| 103 | tmp = (struct HvLpEvent*)((char*)event + 3 * LpEventAlign); | 103 | tmp = (struct HvLpEvent*)((char*)event + 3 * LpEventAlign); |
| 104 | tmp->xFlags.xValid = 0; | 104 | hvlpevent_invalidate(tmp); |
| 105 | case 2: | 105 | case 2: |
| 106 | tmp = (struct HvLpEvent*)((char*)event + 2 * LpEventAlign); | 106 | tmp = (struct HvLpEvent*)((char*)event + 2 * LpEventAlign); |
| 107 | tmp->xFlags.xValid = 0; | 107 | hvlpevent_invalidate(tmp); |
| 108 | case 1: | 108 | case 1: |
| 109 | tmp = (struct HvLpEvent*)((char*)event + 1 * LpEventAlign); | 109 | tmp = (struct HvLpEvent*)((char*)event + 1 * LpEventAlign); |
| 110 | tmp->xFlags.xValid = 0; | 110 | hvlpevent_invalidate(tmp); |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | mb(); | 113 | mb(); |
| 114 | 114 | ||
| 115 | event->xFlags.xValid = 0; | 115 | hvlpevent_invalidate(event); |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | void process_hvlpevents(struct pt_regs *regs) | 118 | void process_hvlpevents(struct pt_regs *regs) |
diff --git a/arch/powerpc/platforms/iseries/mf.c b/arch/powerpc/platforms/iseries/mf.c index 49e7e4b85847..a41d8b78c0cd 100644 --- a/arch/powerpc/platforms/iseries/mf.c +++ b/arch/powerpc/platforms/iseries/mf.c | |||
| @@ -251,10 +251,7 @@ static struct pending_event *new_pending_event(void) | |||
| 251 | } | 251 | } |
| 252 | memset(ev, 0, sizeof(struct pending_event)); | 252 | memset(ev, 0, sizeof(struct pending_event)); |
| 253 | hev = &ev->event.hp_lp_event; | 253 | hev = &ev->event.hp_lp_event; |
| 254 | hev->xFlags.xValid = 1; | 254 | hev->flags = HV_LP_EVENT_VALID | HV_LP_EVENT_DO_ACK | HV_LP_EVENT_INT; |
| 255 | hev->xFlags.xAckType = HvLpEvent_AckType_ImmediateAck; | ||
| 256 | hev->xFlags.xAckInd = HvLpEvent_AckInd_DoAck; | ||
| 257 | hev->xFlags.xFunction = HvLpEvent_Function_Int; | ||
| 258 | hev->xType = HvLpEvent_Type_MachineFac; | 255 | hev->xType = HvLpEvent_Type_MachineFac; |
| 259 | hev->xSourceLp = HvLpConfig_getLpIndex(); | 256 | hev->xSourceLp = HvLpConfig_getLpIndex(); |
| 260 | hev->xTargetLp = primary_lp; | 257 | hev->xTargetLp = primary_lp; |
| @@ -518,17 +515,10 @@ static void handle_ack(struct io_mf_lp_event *event) | |||
| 518 | static void hv_handler(struct HvLpEvent *event, struct pt_regs *regs) | 515 | static void hv_handler(struct HvLpEvent *event, struct pt_regs *regs) |
| 519 | { | 516 | { |
| 520 | if ((event != NULL) && (event->xType == HvLpEvent_Type_MachineFac)) { | 517 | if ((event != NULL) && (event->xType == HvLpEvent_Type_MachineFac)) { |
| 521 | switch(event->xFlags.xFunction) { | 518 | if (hvlpevent_is_ack(event)) |
| 522 | case HvLpEvent_Function_Ack: | ||
| 523 | handle_ack((struct io_mf_lp_event *)event); | 519 | handle_ack((struct io_mf_lp_event *)event); |
| 524 | break; | 520 | else |
| 525 | case HvLpEvent_Function_Int: | ||
| 526 | handle_int((struct io_mf_lp_event *)event); | 521 | handle_int((struct io_mf_lp_event *)event); |
| 527 | break; | ||
| 528 | default: | ||
| 529 | printk(KERN_ERR "mf.c: non ack/int event received\n"); | ||
| 530 | break; | ||
| 531 | } | ||
| 532 | } else | 522 | } else |
| 533 | printk(KERN_ERR "mf.c: alien event received\n"); | 523 | printk(KERN_ERR "mf.c: alien event received\n"); |
| 534 | } | 524 | } |
diff --git a/arch/powerpc/platforms/iseries/viopath.c b/arch/powerpc/platforms/iseries/viopath.c index 842672695598..622a30149b48 100644 --- a/arch/powerpc/platforms/iseries/viopath.c +++ b/arch/powerpc/platforms/iseries/viopath.c | |||
| @@ -270,7 +270,7 @@ static void handleMonitorEvent(struct HvLpEvent *event) | |||
| 270 | * First see if this is just a normal monitor message from the | 270 | * First see if this is just a normal monitor message from the |
| 271 | * other partition | 271 | * other partition |
| 272 | */ | 272 | */ |
| 273 | if (event->xFlags.xFunction == HvLpEvent_Function_Int) { | 273 | if (hvlpevent_is_int(event)) { |
| 274 | remoteLp = event->xSourceLp; | 274 | remoteLp = event->xSourceLp; |
| 275 | if (!viopathStatus[remoteLp].isActive) | 275 | if (!viopathStatus[remoteLp].isActive) |
| 276 | sendMonMsg(remoteLp); | 276 | sendMonMsg(remoteLp); |
| @@ -331,13 +331,12 @@ static void handleConfig(struct HvLpEvent *event) | |||
| 331 | { | 331 | { |
| 332 | if (!event) | 332 | if (!event) |
| 333 | return; | 333 | return; |
| 334 | if (event->xFlags.xFunction == HvLpEvent_Function_Int) { | 334 | if (hvlpevent_is_int(event)) { |
| 335 | printk(VIOPATH_KERN_WARN | 335 | printk(VIOPATH_KERN_WARN |
| 336 | "unexpected config request from partition %d", | 336 | "unexpected config request from partition %d", |
| 337 | event->xSourceLp); | 337 | event->xSourceLp); |
| 338 | 338 | ||
| 339 | if ((event->xFlags.xFunction == HvLpEvent_Function_Int) && | 339 | if (hvlpevent_need_ack(event)) { |
| 340 | (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck)) { | ||
| 341 | event->xRc = HvLpEvent_Rc_InvalidSubtype; | 340 | event->xRc = HvLpEvent_Rc_InvalidSubtype; |
| 342 | HvCallEvent_ackLpEvent(event); | 341 | HvCallEvent_ackLpEvent(event); |
| 343 | } | 342 | } |
| @@ -377,7 +376,7 @@ static void vio_handleEvent(struct HvLpEvent *event, struct pt_regs *regs) | |||
| 377 | int subtype = (event->xSubtype & VIOMAJOR_SUBTYPE_MASK) | 376 | int subtype = (event->xSubtype & VIOMAJOR_SUBTYPE_MASK) |
| 378 | >> VIOMAJOR_SUBTYPE_SHIFT; | 377 | >> VIOMAJOR_SUBTYPE_SHIFT; |
| 379 | 378 | ||
| 380 | if (event->xFlags.xFunction == HvLpEvent_Function_Int) { | 379 | if (hvlpevent_is_int(event)) { |
| 381 | remoteLp = event->xSourceLp; | 380 | remoteLp = event->xSourceLp; |
| 382 | /* | 381 | /* |
| 383 | * The isActive is checked because if the hosting partition | 382 | * The isActive is checked because if the hosting partition |
| @@ -436,8 +435,7 @@ static void vio_handleEvent(struct HvLpEvent *event, struct pt_regs *regs) | |||
| 436 | "unexpected virtual io event subtype %d from partition %d\n", | 435 | "unexpected virtual io event subtype %d from partition %d\n", |
| 437 | event->xSubtype, remoteLp); | 436 | event->xSubtype, remoteLp); |
| 438 | /* No handler. Ack if necessary */ | 437 | /* No handler. Ack if necessary */ |
| 439 | if ((event->xFlags.xFunction == HvLpEvent_Function_Int) && | 438 | if (hvlpevent_is_int(event) && hvlpevent_need_ack(event)) { |
| 440 | (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck)) { | ||
| 441 | event->xRc = HvLpEvent_Rc_InvalidSubtype; | 439 | event->xRc = HvLpEvent_Rc_InvalidSubtype; |
| 442 | HvCallEvent_ackLpEvent(event); | 440 | HvCallEvent_ackLpEvent(event); |
| 443 | } | 441 | } |
diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c index d1aaf31bd97e..f63e07bd9f9c 100644 --- a/drivers/block/viodasd.c +++ b/drivers/block/viodasd.c | |||
| @@ -293,6 +293,7 @@ static int send_request(struct request *req) | |||
| 293 | u16 viocmd; | 293 | u16 viocmd; |
| 294 | HvLpEvent_Rc hvrc; | 294 | HvLpEvent_Rc hvrc; |
| 295 | struct vioblocklpevent *bevent; | 295 | struct vioblocklpevent *bevent; |
| 296 | struct HvLpEvent *hev; | ||
| 296 | struct scatterlist sg[VIOMAXBLOCKDMA]; | 297 | struct scatterlist sg[VIOMAXBLOCKDMA]; |
| 297 | int sgindex; | 298 | int sgindex; |
| 298 | int statindex; | 299 | int statindex; |
| @@ -347,22 +348,19 @@ static int send_request(struct request *req) | |||
| 347 | * token so we can match the response up later | 348 | * token so we can match the response up later |
| 348 | */ | 349 | */ |
| 349 | memset(bevent, 0, sizeof(struct vioblocklpevent)); | 350 | memset(bevent, 0, sizeof(struct vioblocklpevent)); |
| 350 | bevent->event.xFlags.xValid = 1; | 351 | hev = &bevent->event; |
| 351 | bevent->event.xFlags.xFunction = HvLpEvent_Function_Int; | 352 | hev->flags = HV_LP_EVENT_VALID | HV_LP_EVENT_DO_ACK | |
| 352 | bevent->event.xFlags.xAckInd = HvLpEvent_AckInd_DoAck; | 353 | HV_LP_EVENT_INT; |
| 353 | bevent->event.xFlags.xAckType = HvLpEvent_AckType_ImmediateAck; | 354 | hev->xType = HvLpEvent_Type_VirtualIo; |
| 354 | bevent->event.xType = HvLpEvent_Type_VirtualIo; | 355 | hev->xSubtype = viocmd; |
| 355 | bevent->event.xSubtype = viocmd; | 356 | hev->xSourceLp = HvLpConfig_getLpIndex(); |
| 356 | bevent->event.xSourceLp = HvLpConfig_getLpIndex(); | 357 | hev->xTargetLp = viopath_hostLp; |
| 357 | bevent->event.xTargetLp = viopath_hostLp; | 358 | hev->xSizeMinus1 = |
| 358 | bevent->event.xSizeMinus1 = | ||
| 359 | offsetof(struct vioblocklpevent, u.rw_data.dma_info) + | 359 | offsetof(struct vioblocklpevent, u.rw_data.dma_info) + |
| 360 | (sizeof(bevent->u.rw_data.dma_info[0]) * nsg) - 1; | 360 | (sizeof(bevent->u.rw_data.dma_info[0]) * nsg) - 1; |
| 361 | bevent->event.xSourceInstanceId = | 361 | hev->xSourceInstanceId = viopath_sourceinst(viopath_hostLp); |
| 362 | viopath_sourceinst(viopath_hostLp); | 362 | hev->xTargetInstanceId = viopath_targetinst(viopath_hostLp); |
| 363 | bevent->event.xTargetInstanceId = | 363 | hev->xCorrelationToken = (u64)req; |
| 364 | viopath_targetinst(viopath_hostLp); | ||
| 365 | bevent->event.xCorrelationToken = (u64)req; | ||
| 366 | bevent->version = VIOVERSION; | 364 | bevent->version = VIOVERSION; |
| 367 | bevent->disk = DEVICE_NO(d); | 365 | bevent->disk = DEVICE_NO(d); |
| 368 | bevent->u.rw_data.offset = start; | 366 | bevent->u.rw_data.offset = start; |
| @@ -649,10 +647,10 @@ static void handle_block_event(struct HvLpEvent *event) | |||
| 649 | /* Notification that a partition went away! */ | 647 | /* Notification that a partition went away! */ |
| 650 | return; | 648 | return; |
| 651 | /* First, we should NEVER get an int here...only acks */ | 649 | /* First, we should NEVER get an int here...only acks */ |
| 652 | if (event->xFlags.xFunction == HvLpEvent_Function_Int) { | 650 | if (hvlpevent_is_int(event)) { |
| 653 | printk(VIOD_KERN_WARNING | 651 | printk(VIOD_KERN_WARNING |
| 654 | "Yikes! got an int in viodasd event handler!\n"); | 652 | "Yikes! got an int in viodasd event handler!\n"); |
| 655 | if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) { | 653 | if (hvlpevent_need_ack(event)) { |
| 656 | event->xRc = HvLpEvent_Rc_InvalidSubtype; | 654 | event->xRc = HvLpEvent_Rc_InvalidSubtype; |
| 657 | HvCallEvent_ackLpEvent(event); | 655 | HvCallEvent_ackLpEvent(event); |
| 658 | } | 656 | } |
| @@ -695,7 +693,7 @@ static void handle_block_event(struct HvLpEvent *event) | |||
| 695 | 693 | ||
| 696 | default: | 694 | default: |
| 697 | printk(VIOD_KERN_WARNING "invalid subtype!"); | 695 | printk(VIOD_KERN_WARNING "invalid subtype!"); |
| 698 | if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) { | 696 | if (hvlpevent_need_ack(event)) { |
| 699 | event->xRc = HvLpEvent_Rc_InvalidSubtype; | 697 | event->xRc = HvLpEvent_Rc_InvalidSubtype; |
| 700 | HvCallEvent_ackLpEvent(event); | 698 | HvCallEvent_ackLpEvent(event); |
| 701 | } | 699 | } |
diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c index b5191780ecca..193446e6a08a 100644 --- a/drivers/cdrom/viocd.c +++ b/drivers/cdrom/viocd.c | |||
| @@ -542,10 +542,10 @@ static void vio_handle_cd_event(struct HvLpEvent *event) | |||
| 542 | /* Notification that a partition went away! */ | 542 | /* Notification that a partition went away! */ |
| 543 | return; | 543 | return; |
| 544 | /* First, we should NEVER get an int here...only acks */ | 544 | /* First, we should NEVER get an int here...only acks */ |
| 545 | if (event->xFlags.xFunction == HvLpEvent_Function_Int) { | 545 | if (hvlpevent_is_int(event)) { |
| 546 | printk(VIOCD_KERN_WARNING | 546 | printk(VIOCD_KERN_WARNING |
| 547 | "Yikes! got an int in viocd event handler!\n"); | 547 | "Yikes! got an int in viocd event handler!\n"); |
| 548 | if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) { | 548 | if (hvlpevent_need_ack(event)) { |
| 549 | event->xRc = HvLpEvent_Rc_InvalidSubtype; | 549 | event->xRc = HvLpEvent_Rc_InvalidSubtype; |
| 550 | HvCallEvent_ackLpEvent(event); | 550 | HvCallEvent_ackLpEvent(event); |
| 551 | } | 551 | } |
| @@ -616,7 +616,7 @@ return_complete: | |||
| 616 | printk(VIOCD_KERN_WARNING | 616 | printk(VIOCD_KERN_WARNING |
| 617 | "message with invalid subtype %0x04X!\n", | 617 | "message with invalid subtype %0x04X!\n", |
| 618 | event->xSubtype & VIOMINOR_SUBTYPE_MASK); | 618 | event->xSubtype & VIOMINOR_SUBTYPE_MASK); |
| 619 | if (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck) { | 619 | if (hvlpevent_need_ack(event)) { |
| 620 | event->xRc = HvLpEvent_Rc_InvalidSubtype; | 620 | event->xRc = HvLpEvent_Rc_InvalidSubtype; |
| 621 | HvCallEvent_ackLpEvent(event); | 621 | HvCallEvent_ackLpEvent(event); |
| 622 | } | 622 | } |
diff --git a/drivers/char/viocons.c b/drivers/char/viocons.c index faee5e7acaf7..4e5360388748 100644 --- a/drivers/char/viocons.c +++ b/drivers/char/viocons.c | |||
| @@ -476,19 +476,19 @@ static struct port_info *get_port_data(struct tty_struct *tty) | |||
| 476 | */ | 476 | */ |
| 477 | static void initDataEvent(struct viocharlpevent *viochar, HvLpIndex lp) | 477 | static void initDataEvent(struct viocharlpevent *viochar, HvLpIndex lp) |
| 478 | { | 478 | { |
| 479 | struct HvLpEvent *hev = &viochar->event; | ||
| 480 | |||
| 479 | memset(viochar, 0, sizeof(struct viocharlpevent)); | 481 | memset(viochar, 0, sizeof(struct viocharlpevent)); |
| 480 | 482 | ||
| 481 | viochar->event.xFlags.xValid = 1; | 483 | hev->flags = HV_LP_EVENT_VALID | HV_LP_EVENT_DEFERRED_ACK | |
| 482 | viochar->event.xFlags.xFunction = HvLpEvent_Function_Int; | 484 | HV_LP_EVENT_INT; |
| 483 | viochar->event.xFlags.xAckInd = HvLpEvent_AckInd_NoAck; | 485 | hev->xType = HvLpEvent_Type_VirtualIo; |
| 484 | viochar->event.xFlags.xAckType = HvLpEvent_AckType_DeferredAck; | 486 | hev->xSubtype = viomajorsubtype_chario | viochardata; |
| 485 | viochar->event.xType = HvLpEvent_Type_VirtualIo; | 487 | hev->xSourceLp = HvLpConfig_getLpIndex(); |
| 486 | viochar->event.xSubtype = viomajorsubtype_chario | viochardata; | 488 | hev->xTargetLp = lp; |
| 487 | viochar->event.xSourceLp = HvLpConfig_getLpIndex(); | 489 | hev->xSizeMinus1 = sizeof(struct viocharlpevent); |
| 488 | viochar->event.xTargetLp = lp; | 490 | hev->xSourceInstanceId = viopath_sourceinst(lp); |
| 489 | viochar->event.xSizeMinus1 = sizeof(struct viocharlpevent); | 491 | hev->xTargetInstanceId = viopath_targetinst(lp); |
| 490 | viochar->event.xSourceInstanceId = viopath_sourceinst(lp); | ||
| 491 | viochar->event.xTargetInstanceId = viopath_targetinst(lp); | ||
| 492 | } | 492 | } |
| 493 | 493 | ||
| 494 | /* | 494 | /* |
| @@ -752,7 +752,7 @@ static void vioHandleOpenEvent(struct HvLpEvent *event) | |||
| 752 | struct port_info *pi; | 752 | struct port_info *pi; |
| 753 | int reject = 0; | 753 | int reject = 0; |
| 754 | 754 | ||
| 755 | if (event->xFlags.xFunction == HvLpEvent_Function_Ack) { | 755 | if (hvlpevent_is_ack(event)) { |
| 756 | if (port >= VTTY_PORTS) | 756 | if (port >= VTTY_PORTS) |
| 757 | return; | 757 | return; |
| 758 | 758 | ||
| @@ -788,7 +788,7 @@ static void vioHandleOpenEvent(struct HvLpEvent *event) | |||
| 788 | } | 788 | } |
| 789 | 789 | ||
| 790 | /* This had better require an ack, otherwise complain */ | 790 | /* This had better require an ack, otherwise complain */ |
| 791 | if (event->xFlags.xAckInd != HvLpEvent_AckInd_DoAck) { | 791 | if (!hvlpevent_need_ack(event)) { |
| 792 | printk(VIOCONS_KERN_WARN "viocharopen without ack bit!\n"); | 792 | printk(VIOCONS_KERN_WARN "viocharopen without ack bit!\n"); |
| 793 | return; | 793 | return; |
| 794 | } | 794 | } |
| @@ -856,7 +856,7 @@ static void vioHandleCloseEvent(struct HvLpEvent *event) | |||
| 856 | struct viocharlpevent *cevent = (struct viocharlpevent *)event; | 856 | struct viocharlpevent *cevent = (struct viocharlpevent *)event; |
| 857 | u8 port = cevent->virtual_device; | 857 | u8 port = cevent->virtual_device; |
| 858 | 858 | ||
| 859 | if (event->xFlags.xFunction == HvLpEvent_Function_Int) { | 859 | if (hvlpevent_is_int(event)) { |
| 860 | if (port >= VTTY_PORTS) { | 860 | if (port >= VTTY_PORTS) { |
| 861 | printk(VIOCONS_KERN_WARN | 861 | printk(VIOCONS_KERN_WARN |
| 862 | "close message from invalid virtual device.\n"); | 862 | "close message from invalid virtual device.\n"); |
| @@ -1056,8 +1056,7 @@ static void vioHandleCharEvent(struct HvLpEvent *event) | |||
| 1056 | vioHandleConfig(event); | 1056 | vioHandleConfig(event); |
| 1057 | break; | 1057 | break; |
| 1058 | default: | 1058 | default: |
| 1059 | if ((event->xFlags.xFunction == HvLpEvent_Function_Int) && | 1059 | if (hvlpevent_is_int(event) && hvlpevent_need_ack(event)) { |
| 1060 | (event->xFlags.xAckInd == HvLpEvent_AckInd_DoAck)) { | ||
| 1061 | event->xRc = HvLpEvent_Rc_InvalidSubtype; | 1060 | event->xRc = HvLpEvent_Rc_InvalidSubtype; |
| 1062 | HvCallEvent_ackLpEvent(event); | 1061 | HvCallEvent_ackLpEvent(event); |
| 1063 | } | 1062 | } |
diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c index 77eadf84cb2c..f0f04be989d6 100644 --- a/drivers/net/iseries_veth.c +++ b/drivers/net/iseries_veth.c | |||
| @@ -590,9 +590,9 @@ static void veth_handle_event(struct HvLpEvent *event, struct pt_regs *regs) | |||
| 590 | { | 590 | { |
| 591 | struct veth_lpevent *veth_event = (struct veth_lpevent *)event; | 591 | struct veth_lpevent *veth_event = (struct veth_lpevent *)event; |
| 592 | 592 | ||
| 593 | if (event->xFlags.xFunction == HvLpEvent_Function_Ack) | 593 | if (hvlpevent_is_ack(event)) |
| 594 | veth_handle_ack(veth_event); | 594 | veth_handle_ack(veth_event); |
| 595 | else if (event->xFlags.xFunction == HvLpEvent_Function_Int) | 595 | else |
| 596 | veth_handle_int(veth_event); | 596 | veth_handle_int(veth_event); |
| 597 | } | 597 | } |
| 598 | 598 | ||
diff --git a/include/asm-powerpc/iseries/hv_lp_event.h b/include/asm-powerpc/iseries/hv_lp_event.h index 499ab1ad0185..8ee89b67b8fd 100644 --- a/include/asm-powerpc/iseries/hv_lp_event.h +++ b/include/asm-powerpc/iseries/hv_lp_event.h | |||
| @@ -32,17 +32,8 @@ | |||
| 32 | * partitions through PLIC. | 32 | * partitions through PLIC. |
| 33 | */ | 33 | */ |
| 34 | 34 | ||
| 35 | struct HvEventFlags { | ||
| 36 | u8 xValid:1; /* Indicates a valid request x00-x00 */ | ||
| 37 | u8 xRsvd1:4; /* Reserved ... */ | ||
| 38 | u8 xAckType:1; /* Immediate or deferred ... */ | ||
| 39 | u8 xAckInd:1; /* Indicates if ACK required ... */ | ||
| 40 | u8 xFunction:1; /* Interrupt or Acknowledge ... */ | ||
| 41 | }; | ||
| 42 | |||
| 43 | |||
| 44 | struct HvLpEvent { | 35 | struct HvLpEvent { |
| 45 | struct HvEventFlags xFlags; /* Event flags x00-x00 */ | 36 | u8 flags; /* Event flags x00-x00 */ |
| 46 | u8 xType; /* Type of message x01-x01 */ | 37 | u8 xType; /* Type of message x01-x01 */ |
| 47 | u16 xSubtype; /* Subtype for event x02-x03 */ | 38 | u16 xSubtype; /* Subtype for event x02-x03 */ |
| 48 | u8 xSourceLp; /* Source LP x04-x04 */ | 39 | u8 xSourceLp; /* Source LP x04-x04 */ |
| @@ -126,6 +117,11 @@ extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex); | |||
| 126 | #define HvLpEvent_AckType_ImmediateAck 0 | 117 | #define HvLpEvent_AckType_ImmediateAck 0 |
| 127 | #define HvLpEvent_AckType_DeferredAck 1 | 118 | #define HvLpEvent_AckType_DeferredAck 1 |
| 128 | 119 | ||
| 120 | #define HV_LP_EVENT_INT 0x01 | ||
| 121 | #define HV_LP_EVENT_DO_ACK 0x02 | ||
| 122 | #define HV_LP_EVENT_DEFERRED_ACK 0x04 | ||
| 123 | #define HV_LP_EVENT_VALID 0x80 | ||
| 124 | |||
| 129 | #define HvLpDma_Direction_LocalToRemote 0 | 125 | #define HvLpDma_Direction_LocalToRemote 0 |
| 130 | #define HvLpDma_Direction_RemoteToLocal 1 | 126 | #define HvLpDma_Direction_RemoteToLocal 1 |
| 131 | 127 | ||
| @@ -139,4 +135,29 @@ extern int HvLpEvent_closePath(HvLpEvent_Type eventType, HvLpIndex lpIndex); | |||
| 139 | #define HvLpDma_Rc_InvalidAddress 4 | 135 | #define HvLpDma_Rc_InvalidAddress 4 |
| 140 | #define HvLpDma_Rc_InvalidLength 5 | 136 | #define HvLpDma_Rc_InvalidLength 5 |
| 141 | 137 | ||
| 138 | static inline int hvlpevent_is_valid(struct HvLpEvent *h) | ||
| 139 | { | ||
| 140 | return h->flags & HV_LP_EVENT_VALID; | ||
| 141 | } | ||
| 142 | |||
| 143 | static inline void hvlpevent_invalidate(struct HvLpEvent *h) | ||
| 144 | { | ||
| 145 | h->flags &= ~ HV_LP_EVENT_VALID; | ||
| 146 | } | ||
| 147 | |||
| 148 | static inline int hvlpevent_is_int(struct HvLpEvent *h) | ||
| 149 | { | ||
| 150 | return h->flags & HV_LP_EVENT_INT; | ||
| 151 | } | ||
| 152 | |||
| 153 | static inline int hvlpevent_is_ack(struct HvLpEvent *h) | ||
| 154 | { | ||
| 155 | return !hvlpevent_is_int(h); | ||
| 156 | } | ||
| 157 | |||
| 158 | static inline int hvlpevent_need_ack(struct HvLpEvent *h) | ||
| 159 | { | ||
| 160 | return h->flags & HV_LP_EVENT_DO_ACK; | ||
| 161 | } | ||
| 162 | |||
| 142 | #endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */ | 163 | #endif /* _ASM_POWERPC_ISERIES_HV_LP_EVENT_H */ |
