📄 mtest.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <conio.h>
#include <graph.h>
#include <time.h>
#include "common.h"
#define SERVER 1
#define CLIENT 2
//------------------------ Definition ------------------
int search_packet_driver_vector(int);
void prepare_send_buffer(char *, int);
void prepare_magic_packet(char* send_buffer);
int set_access_type(int,int *,void far *);
int release_type(int ,int);
int get_address(int, int, char far *);
int set_rcv_mode(int, int, int);
int send_pkt(int, unsigned int, char far *);
int wait_packet_received(char *, char *, char *, int *);
int ppong_test(int);
int init_card1_drv(void);
int init_card2_drv(void);
int release_drv(int);
int check_EEPROM(void);
int add_ID(void);
// External Variable
void pascal far receive_handler1();
void pascal far receive_handler2();
extern int init_card1(void);
extern int init_card2(void);
extern int set_PCI_D3(void);
extern int set_PCI_D0(void);
extern int chk_ACPI(void);
extern void Delay10us(unsigned int );
extern void print_msg(char, char *);
extern void draw_screen1(void);
extern void draw_screen2(void);
extern void PrintLetter(int , unsigned char);
extern void print_OX(int);
extern void ShowMacAddress(void);
extern void ReadCfg(unsigned int [], int,int *);
extern int scan(void);
//----------------------------------------------------------------------------
static char packet_signature[]="PKT DRVR";
int packet_isr1, packet_isr2, packet_handle1, packet_handle2;
int RxDataLength1, RxDataLength2;
char ether_id1[6], ether_id2[6];
unsigned char send_buffer1[3000], send_buffer2[3000];
unsigned char RxBufferInUse1, RxBufferInUse2;
unsigned char RxBuffer1[3000], RxBuffer2[3000];
unsigned long tx_count1=0, rx_count1=0, tx_lost1=0, rx_lost1=0, mg_tx_count1=0;
unsigned long tx_count2=0, rx_count2=0, tx_lost2=0, rx_lost2=0, mg_rx_count2=0;
char error_code,str[80];
int row=1, WordCount;
unsigned p_len;
unsigned int PM_CSR, s_io_base,c_io_base;
unsigned char s_slot,c_slot;
union REGS inregs,outregs;
struct SREGS segregs;
int server_card;
//========================== Program ====================
int main(void)
{
unsigned int tmp;
int result, i;
char string[10];
// do{
// draw_screen1();
// }while(scan()!=0);
draw_screen2();
server_card = init_card1();
if( server_card == 0 )
{
if(init_card1_drv()!=0)
return 1;
}
_settextwindow(1,1,25,80);
_settextcolor(WHITE);
_settextposition(8,57);
for(i=0;i<6;i++){
sprintf(str,"%02X ",(unsigned char)ether_id1[i]);
_outtext(str);
}
if(init_card2()==0){
if(init_card2_drv()!=0){
print_OX(FAIL);
if(!release_type(packet_isr1, packet_handle1))
print_msg(RED, "Card2 ERROR :Cannot deregister a protocol stack.");
return 2;
}
}
else{
print_OX(FAIL);
if(!release_type(packet_isr1, packet_handle1)) {
print_msg(RED, "Card1 ERROR-3: cannot deregister a protocol stack.");
return 3;
}
return 2;
}
prepare_send_buffer(send_buffer1,SERVER);
prepare_send_buffer(send_buffer2,CLIENT);
print_msg(YELLOW,"Useing to 100M mode.");
print_msg(WHITE,"Start PingPong Test.");
if(ppong_test(1)!=0){
print_msg(RED_L,"100M PingPong Test fail....");
release_drv(FAIL);
return 1;
}
else
print_msg(GREEN,"100M PingPong Test pass....");
// print_msg(YELLOW,"Switches to 100M mode.");
// outpw(c_io_base+0x62, inpw(c_io_base+0x62)|0x9000);
print_msg(YELLOW,"Switches to 10M mode.");
outpw(c_io_base+0x4c, inpw(c_io_base+0x4c) & 0x0cfff);
for(i=0;i<5;i++){
//if((inp(c_io_base+0x62) & 0x08!=0) && (inp(s_io_base+0x32)==0x6C)){
// if(inp(s_io_base+0x32)==0x6C){
// Delay10us(50000); // 5/100 sec
// break; // check cleint=10M && server=10M
// }
Delay10us(1000); // 1/100 sec
}
print_msg(WHITE,"Start PingPong Test.");
if(ppong_test(2)==0){
print_msg(GREEN,"10M PingPong Test pass....");
print_msg(WHITE,"Start ACPI Function Test.");
print_msg(YELLOW,"Enable PME, Set PCI bus to D3 mode.");
set_PCI_D3();
prepare_magic_packet(send_buffer1);
for(i=0; i<10; i++)
if(send_pkt(packet_isr1,116,send_buffer1)){
print_msg(YELLOW,"Sent magic packet !!");
_settextwindow(1,1,25,80);
_settextcolor(WHITE);
sprintf(string,"%6lu",++mg_tx_count1);
_settextposition(12,61);
_outtext(string);
break;
}
if(chk_ACPI()==0){
print_msg(YELLOW,"Magic packet received !!");
_settextwindow(1,1,25,80);
_settextcolor(WHITE);
_settextposition(17,21);
sprintf(string,"%6lu",++mg_rx_count2);
_outtext(string);
print_msg(YELLOW,"Set PCI bus to D0 mode.");
set_PCI_D0();
print_msg(GREEN,"ACPI Function Test Ok!!.");
release_drv(SUCCESS);
return 0;
}
else{
print_msg(RED_L,"ACPI function Test Fail....");
print_msg(YELLOW,"Set PCI bus to D0 mode.");
set_PCI_D0();
}
}
else
print_msg(RED_L,"10M PingPong Test Fail....");
release_drv(FAIL);
return 1;
}
// ---------------------- Sub Function ------------------
int search_packet_driver_vector(int card_num)
{
int vector_no;
int done_flag=0;
int far *ptr;
char far *packet_driver_entry;
int x, y, i;
char signature[10];
for(vector_no=0x60; (vector_no<0x81) && (done_flag!=card_num); vector_no++) {
ptr = _MK_FP (0x00, (vector_no*4)); //
x= *(ptr+1); //
y= *ptr; // search for keyword
packet_driver_entry = _MK_FP (x,y); // "PKT DRVR"
for(i=0;i<9;i++) // 3 bytes for JUMP instruction
signature[i]= *(packet_driver_entry+3+i); //
if(strcmp (packet_signature, signature)==0)
done_flag++;
}
vector_no--;
if(done_flag)
return vector_no;
return 0;
}
// ******************************
void prepare_send_buffer(char* send_buffer,int chk)
{
int i;
char tempc;
if(chk==SERVER){
for(i=0;i<6;i++)
send_buffer[i]=ether_id2[i];
for(i=6;i<12;i++)
send_buffer[i]=ether_id1[i-6];
}
else{
for(i=0;i<6;i++)
send_buffer[i]=ether_id1[i];
for(i=6;i<12;i++)
send_buffer[i]=ether_id2[i-6];
}
for(i=14;i<3000;i++)
send_buffer[i]=0x00;
send_buffer[12]=0xac;
send_buffer[13]=0xca;
tempc=0x30;
for(i=14;i<3000;i++) {
send_buffer[i]=tempc;
if(++tempc > 0x5a)
tempc=0x30;
}
}
// ******************************
void prepare_magic_packet(char* send_buffer)
{
int i,j;
for(i=0;i<6;i++)
send_buffer[i]=ether_id2[i];
for(;i<12;i++)
send_buffer[i]=ether_id1[i];
send_buffer[12]=0x00; // packet length
send_buffer[13]=102;
for(i=14;i<20;i++)
send_buffer[i]=0xff;
for(i=0;i<16;i++)
for(j=0;j<6;j++)
send_buffer[20+i*6+j]=ether_id2[j];
}
// ******************************
int set_access_type(int packet_isr,int *packet_handle,void far *tr)
{
union _REGS inregs, outregs;
struct _SREGS segregs;
char type_string[2]={0xac,0xca};
char far *ts= type_string;
inregs.h.al=0x01; // AL=0x01 if_class
inregs.h.ah=0x02; // AH=0x02 access_type()
inregs.x.bx=0xffff; // BX=-1 if_type
inregs.h.dl=0; // DL=0 if_number
inregs.x.cx=2; // CX=2 type length
segregs.ds= _FP_SEG (ts); // DS:SI type
inregs.x.si= _FP_OFF (ts);
segregs.es= _FP_SEG (tr); // ES:DI *receiver
inregs.x.di= _FP_OFF (tr);
_int86x (packet_isr, &inregs, &outregs, &segregs);
if(outregs.x.cflag)
return FALSE;
else{
*packet_handle= outregs.x.ax;
return TRUE;
}
}
// ******************************
int release_type(int packet_isr, int packet_handle)
{
union _REGS inregs, outregs;
struct _SREGS segregs;
inregs.h.ah=0x03; // AH=0x02 release_type()
inregs.x.bx=packet_handle; // BX= handle
_int86x (packet_isr, &inregs, &outregs, &segregs);
return (!outregs.x.cflag);
}
// ******************************
int get_address(int packet_isr, int packet_handle, char far *ei)
{
union _REGS inregs, outregs;
struct _SREGS segregs;
inregs.h.ah=0x06; // AH=0x02 get_address()
inregs.x.bx=packet_handle; // BX= handle
inregs.x.cx=0x06; // CX= buffer length
segregs.es= _FP_SEG (ei); // ES:DI buffer pointer
inregs.x.di= _FP_OFF (ei);
_int86x (packet_isr, &inregs, &outregs, &segregs);
if((outregs.x.cflag)||(outregs.x.cx<6))
return (FALSE);
return (TRUE);
}
// ********************************
int set_rcv_mode(int packet_isr,int packet_handle,int mode)
{
union _REGS inregs, outregs;
struct _SREGS segregs;
inregs.h.ah=20; // AH=20 set_rcv_mode()
inregs.x.bx=packet_handle; // BX= handle
inregs.x.cx=mode; // CX= rcv mode
_int86x (packet_isr, &inregs, &outregs, &segregs);
return (!outregs.x.cflag);
}
// ********************************
int send_pkt(int packet_isr, unsigned int length, char far *sb)
{
union _REGS inregs, outregs;
struct _SREGS segregs;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -