diff -urN a/arch/ppc64/kernel/pSeries_hvCall.S b/arch/ppc64/kernel/pSeries_hvCall.S --- a/arch/ppc64/kernel/pSeries_hvCall.S 2003-10-28 16:46:01.000000000 -0600 +++ b/arch/ppc64/kernel/pSeries_hvCall.S 2003-10-28 16:50:36.000000000 -0600 @@ -68,3 +68,39 @@ ld r0,-8(r1) mtcrf 0xff,r0 blr /* return r3 = status */ + + +/* long plpar_hcall_8arg_2ret(unsigned long opcode, R3 + unsigned long arg1, R4 + unsigned long arg2, R5 + unsigned long arg3, R6 + unsigned long arg4, R7 + unsigned long arg5, R8 + unsigned long arg6, R9 + unsigned long arg7, R10 + unsigned long arg8, 112(R1) + unsigned long *out1); 120(R1) + + */ + + .text +_GLOBAL(plpar_hcall_8arg_2ret) + mfcr r0 + + ld r11, 112(r1) /* put arg8 and out1 in R11 and R12 */ + ld r12, 120(r1) + + std r0,-8(r1) + stdu r1,-32(r1) + + std r12,-8(r1) /* Save out ptr */ + + HSC /* invoke the hypervisor */ + + ld r10,-8(r1) /* Fetch r4 ret arg */ + std r4,0(r10) + + ld r1,0(r1) + ld r0,-8(r1) + mtcrf 0xff,r0 + blr /* return r3 = status */ diff -urN a/drivers/net/ibmveth.c b/drivers/net/ibmveth.c --- a/drivers/net/ibmveth.c 2003-10-28 16:45:41.000000000 -0600 +++ b/drivers/net/ibmveth.c 2003-10-28 16:49:45.000000000 -0600 @@ -696,24 +696,16 @@ /* send the frame */ unsigned long correlator = 0; - do { - __asm__ __volatile__(" li 3,0x120 \n\t" - " mr 4, %2 \n\t" - " mr 5, %3 \n\t" - " mr 6, %4 \n\t" - " mr 7, %5 \n\t" - " mr 8, %6 \n\t" - " mr 9, %7 \n\t" - " mr 10, %8 \n\t" - " mr 11, %9 \n\t" - " .long 0x44000022 \n\t" - " mr %1, 3 \n\t" - " mr %0, 4 \n\t" - : "=&r"(correlator), "=&r"(lpar_rc) - : "r" (adapter->vdev->unit_address), "r" (desc[0].desc), "r" (desc[1].desc), "r" (desc[2].desc), "r" (desc[3].desc), "r" (desc[4].desc), "r" (desc[5].desc), "r" (correlator) - : "r0","r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "cr0", "cr1", "ctr", "xer", "memory"); - - } while(lpar_rc == H_Busy); + do { + lpar_rc = h_send_logical_lan(adapter->vdev->unit_address, + desc[0].desc, + desc[1].desc, + desc[2].desc, + desc[3].desc, + desc[4].desc, + desc[5].desc, + correlator); + } while (lpar_rc == H_Busy); if(lpar_rc != H_Success && lpar_rc != H_Dropped) { int i; diff -urN a/include/asm-ppc64/hvcall.h b/include/asm-ppc64/hvcall.h --- a/include/asm-ppc64/hvcall.h 2003-10-28 16:45:45.000000000 -0600 +++ b/include/asm-ppc64/hvcall.h 2003-10-28 16:49:41.000000000 -0600 @@ -102,3 +102,19 @@ */ long plpar_hcall_norets(unsigned long opcode, ...); +/* + * Special hcall interface for ibmveth support. + * Takes 8 input parms. Returns a rc and stores the + * R4 return value in *out1. + */ +long plpar_hcall_8arg_2ret(unsigned long opcode, + unsigned long arg1, + unsigned long arg2, + unsigned long arg3, + unsigned long arg4, + unsigned long arg5, + unsigned long arg6, + unsigned long arg7, + unsigned long arg8, + unsigned long *out1); +