void NetManDeinitRPCClient(void){ if(IsInitialized){ WaitSema(NetManIOSemaID); SifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_DEINIT, 0, NULL, 0, NULL, 0, NULL, NULL); deinitCleanup(); IsInitialized=0; } }
int NetManInitRPCClient(void){ static const char NetManID[]="NetMan"; int result; ee_sema_t SemaData; ee_thread_t ThreadData; if(!IsInitialized){ memset(&TxFIFOData1, 0, sizeof(TxFIFOData1)); memset(&TxFIFOData2, 0, sizeof(TxFIFOData2)); TxFIFOData1.FrameBuffer = memalign(64, (MAX_FRAME_SIZE*NETMAN_RPC_BLOCK_SIZE+0x3F)&~0x3F); TxFIFOData2.FrameBuffer = memalign(64, (MAX_FRAME_SIZE*NETMAN_RPC_BLOCK_SIZE+0x3F)&~0x3F); if(TxFIFOData1.FrameBuffer == NULL) return -ENOMEM; if(TxFIFOData2.FrameBuffer == NULL){ deinitCleanup(); return -ENOMEM; } SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(unsigned int)NetManID; SemaData.attr=0; if((NetManIOSemaID=CreateSema(&SemaData)) < 0){ deinitCleanup(); return NetManIOSemaID; } TxActiveBankID=0; CurrentTxFIFOData=UNCACHED_SEG(&TxFIFOData1); SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(unsigned int)NetManID; SemaData.attr=0; if((TxBankAccessSema=CreateSema(&SemaData)) < 0){ deinitCleanup(); return TxBankAccessSema; } SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(unsigned int)NetManID; SemaData.attr=0; if((NetManTxSemaID=CreateSema(&SemaData)) < 0){ deinitCleanup(); return NetManTxSemaID; } ThreadData.func=&TxThread; ThreadData.stack=TxThreadStack; ThreadData.stack_size=sizeof(TxThreadStack); ThreadData.gp_reg=&_gp; ThreadData.initial_priority=0x58; ThreadData.attr=ThreadData.option=0; if((TxThreadID=CreateThread(&ThreadData)) < 0){ deinitCleanup(); return TxThreadID; } if((result = StartThread(TxThreadID, NULL)) < 0){ deinitCleanup(); return result; } while((SifBindRpc(&NETMAN_rpc_cd, NETMAN_RPC_NUMBER, 0)<0)||(NETMAN_rpc_cd.server==NULL)){ nopdelay(); nopdelay(); nopdelay(); nopdelay(); } if((result=SifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_INIT, 0, NULL, 0, ReceiveBuffer, sizeof(int), NULL, NULL))>=0){ if((result=*(int*)ReceiveBuffer) == 0) IsInitialized=1; else deinitCleanup(); }else{ deinitCleanup(); } } else result=0; return result; }
int NetManInitRPCClient(void){ static const char NetManID[]="NetMan"; int result; ee_sema_t SemaData; ee_thread_t ThreadData; if(!IsInitialized) { SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(u32)NetManID; SemaData.attr=0; if((NetManIOSemaID=CreateSema(&SemaData)) < 0) { deinitCleanup(); return NetManIOSemaID; } SemaData.max_count=1; SemaData.init_count=1; SemaData.option=(u32)NetManID; SemaData.attr=0; if((NetManTxSemaID=CreateSema(&SemaData)) < 0) { deinitCleanup(); return NetManTxSemaID; } ThreadData.func=&TxThread; ThreadData.stack=TxThreadStack; ThreadData.stack_size=sizeof(TxThreadStack); ThreadData.gp_reg=&_gp; ThreadData.initial_priority=0x57; //I would design this to have a lower priority than the TCP/IP stack, but somehow that results in worse sending performance (I guess because the TCP/IP stack takes quite a bit of runtime). ThreadData.attr=ThreadData.option=0; if((TxThreadID=CreateThread(&ThreadData)) < 0) { deinitCleanup(); return TxThreadID; } if((result = StartThread(TxThreadID, NULL)) < 0) { deinitCleanup(); return result; } while((SifBindRpc(&NETMAN_rpc_cd, NETMAN_RPC_NUMBER, 0)<0)||(NETMAN_rpc_cd.server==NULL)) nopdelay(); if((result=SifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_INIT, 0, NULL, 0, &ReceiveBuffer, sizeof(s32), NULL, NULL))>=0) { if((result=ReceiveBuffer.result) == 0) IsInitialized=1; else deinitCleanup(); }else{ deinitCleanup(); } } else result=0; return result; }