/* ******************************************************************** */ PFBYTE _ks_realloc(PFBYTE ptr, int num_elements, int size) { #if (DISPLAY_MALLOC) DEBUG_ERROR("ks_realloc free: ", DINT1, ptr, 0); #endif # if (defined (RTKBCPP)) /*#error: needs to be implemented */ ptr = ks_dpmi_alloc((word)(num_elements * size)); # elif (INCLUDE_BGET) ptr = ((PFBYTE)bgetr(ptr, num_elements * size)); # elif (NACT_OS || __TM1__ && INCLUDE_DE4X5) #error: needs to be implemented ptr2 = ks_malloc(ptr, num_elements * size); tc_movebytes(ptr2, ptr, ?); # elif (INCLUDE_WINSOCK || INCLUDE_BSDSOCK) ptr = realloc(ptr, num_elements * size); # elif (defined(SEG_IAR)) /* protected mode */ ptr = realloc(ptr, num_elements * size); # elif ( defined(__BORLANDC__) ) /* real mode */ ptr = _frealloc(ptr, num_elements * size); # else #error: ks_realloc needs to be implemented # endif return(ptr); }
/*----------------------------------------------------------------------* _rtp_malloc *----------------------------------------------------------------------*/ void * _rtp_malloc (unsigned int size) { void * ptr; ptr = (void*) ks_malloc(1, size, 0); if (!ptr) { return ((void *)0); } return (ptr); }
KS_DEVICE_HANDLE ks_device_create(uint8 *device_name, uint8 device_type, uint8 can_shared, file_operations deivce_op) { device_node *device_ptr; device_ptr = (device_node *)ks_malloc(sizeof(device_node)); device_ptr->device_name = device_name; device_ptr->device_type = device_type; device_ptr->can_shared = can_shared; device_ptr->deivce_op = deivce_op; device_ptr->open_count = 0; if(device_ptr->can_shared == NOT_CAN_SHARED){ device_ptr->device_sem = ks_sem_create(1); } device_ptr->state = "create"; return device_ptr; }
ks_event *ks_mutex_create(KS_BASE_TYPE prio,uint8 *error) { ks_event * pevent; if(int_nesting > 0) /*确保中断服务程子程序无法调用*/ { return ((ks_event*)KS_MUTEX_CREATE_ERROR); } #if KS_RR_EN >0 if(prio > KS_MAX_PRIO) /*防止数组溢出 */ { prio = KS_MAX_PRIO - 1; } #else /*如果系统不支持时间轮转法 */ #if KS_CHECK_EN >0 if(prio > KS_MAX_PRIO) { return ((ks_event*)0); /*返回事件空指针 */ } #endif if(readylist[prio].item_numbers >= 1) { return ((ks_event*)0); } #endif pevent = (ks_event*)ks_malloc(sizeof(ks_event)); /*动态申请一个事件块 */ if(pevent == (ks_event*)0) /*事件块申请失败 */ { *error = KS_EVENT_TYPE_NULL; /*设置错误信息 */ return((ks_event*)0); /*返回事件空指针 */ } pevent->event_type = KS_EVENT_TYPE_MUTEX; /*设置事件控制块的类型 */ pevent->pip = prio; /*保存PIP */ #if KS_MAX_PRIO < 256 pevent->mutex_caller = 0xff; /*初始化mutex_caller */ #elif KS_MAX_PRIO <65536 pevent->mutex_caller = 0xffff; /*表示现在还没有占用者 */ #else pevent->mutex_caller = 0xffffffff; #endif pevent->pevent = (void*)0; /*没有线程在等待 */ ks_event_list_init(pevent); /*初始化等待链表 */ *error = KS_NO_ERROR; return(pevent); /*返回事件控制块指针 */ }
ks_event *ks_sem_create(uint16 count) { ks_event *pevent; /*定义一个事件控制块指针*/ if(int_nesting > 0) /*确保中断服务程子程序无法调用*/ { return (ks_event*)KS_SEM_CREATE_ERROR; } pevent = (ks_event*)ks_malloc(sizeof(ks_event)); /*动态申请一个事件块*/ if(pevent != (ks_event*)0) /*事件控制块内存申请成功*/ { pevent->event_type = KS_EVENT_TYPE_SEM;/*设置事件控制块的类型为信号量类型*/ pevent->event_count = count; /*将信号量的初始值放到事件控制块中*/ pevent->pevent = (void*)0; /*将.pevent指针初始化为null*/ ks_event_list_init(pevent); /*初始化等待链表*/ } else { Uart_Printf("I am wrong int the create sem\n");/*显示错误信息*/ } return (pevent); }
RTIP_BOOLEAN davicom_open(PIFACE pi) { PDAVICOM_SOFTC softc; int i; unsigned short w; PFBYTE p; if (davicom_softc[pi->minor_number] == NULL) { p = ks_malloc(sizeof(*softc)+16-1-4, PACKET_POOL_MALLOC, DRV_MALLOC); /* make sure on 16 byte boundary first */ while (((dword)p) & 15) p++; davicom_softc[pi->minor_number] = (PDAVICOM_SOFTC) p; } softc = iface_to_davicom_softc(pi); if (!softc) { set_errno(ENUMDEVICE); return (FALSE); } tc_memset((PFBYTE)softc, 0, sizeof(*softc)); /* Set up the private data structure so that it points to the global interface */ /* structure. (address is needed later when returning packets) */ softc->iface = pi; pi->driver_stats.ether_stats = (PETHER_STATS)&(softc->stats); /* ************************************************************ */ #if (CFG_DAVICOM_PCI) /* read/write suitable values for the PCI configuration registers */ if (!davicom_pci_init(pi, softc)) { DEBUG_ERROR("davicom_open: PCI register configuration failed", NOVAR, 0, 0); set_errno(EPROBEFAIL); /* ??check for a PCI init failed error code?? */ return(FALSE); } #endif /* CFG_DAVICOM_PCI */ /* ************************************************************ */ /* reset the Davicom chip */ WRITE_CR(DC_SCR_CR0, DC_SCR_SW_RESET); /* wait at least 32 PCI clock cycles */ ks_sleep(2); /* ************************************************************ */ /* read local Ethernet address from EEPROM */ w = davicom_read_srom_word( softc, 10 ); /* was 20 */ pi->addr.my_hw_addr[0] = (unsigned char) w; pi->addr.my_hw_addr[1] = (unsigned char) (w >> 8); w = davicom_read_srom_word( softc, 11 ); /* was 22 */ pi->addr.my_hw_addr[2] = (unsigned char) w; pi->addr.my_hw_addr[3] = (unsigned char) (w >> 8); w = davicom_read_srom_word( softc, 12 ); /* was 24 */ pi->addr.my_hw_addr[4] = (unsigned char) w; pi->addr.my_hw_addr[5] = (unsigned char) (w >> 8); #if (DEBUG_DAVICOM) DEBUG_ERROR("ETHERNET ADDRESS: ", ETHERADDR, pi->addr.my_hw_addr, 0); #endif /* ************************************************************ */ /* create the Tx descriptors */ for (i=0; i < DC_TX_RING_SIZE; i++) softc->tx_desc[i].nxt_desc = (dword) (softc->tx_desc + ((i+1) & DC_TX_RING_MASK)); /* create the Rx descriptors */ for (i=0; i < DC_RX_RING_SIZE; i++) { softc->rx_dcus[i] = os_alloc_packet_input(CFG_MAX_PACKETSIZE+4, DRIVER_ALLOC); if (!softc->rx_dcus[i]) { DEBUG_ERROR("davicom_init: out of DCUs", NOVAR, 0, 0); return(set_errno(ENOPKTS)); } softc->rx_desc[i].buffer = (dword) DCUTODATA(softc->rx_dcus[i]); softc->rx_desc[i].ctrl_flags = (CFG_MAX_PACKETSIZE+4) | (1<<24); softc->rx_desc[i].nxt_desc = (dword) (softc->rx_desc + ((i+1) & DC_RX_RING_MASK)); softc->rx_desc[i].status = OWN_BIT; } /* write CR3 and CR4 to provide the starting address of each descriptor */ /* list */ WRITE_CR(DC_RX_BASE_ADDR_CR3, (dword)(softc->rx_desc)); WRITE_CR(DC_TX_BASE_ADDR_CR4, (dword)(softc->tx_desc)); /* ************************************************************ */ /* Write CR0 to set global host bus operation parameters */ WRITE_CR( DC_SCR_CR0, 0 ); /* ************************************************************ */ /* hook the interrupt based up PCI values read */ ks_hook_interrupt(softc->dav_irq, (PFVOID) pi, (RTIPINTFN_POINTER)davicom_interrupt, (RTIPINTFN_POINTER)davicom_pre_interrupt, pi->minor_number); /* ************************************************************ */ /* write CR7 to mask causes of unnecessary interrupt */ WRITE_CR(DC_ISR_MASK_CR7, /* normal */ DC_IMR_NISE | /* Normal interrupt enable */ DC_IMR_RXCIE | /* Receive complete interrupt */ /* DC_IMR_TXDUE | */ /* Transmit buffer unavailable enabled */ DC_IMR_TXCIE | /* Transmit complete interrupt enable */ /* abnormal */ DC_IMR_AISE | /* Abnormal interrupt enable */ DC_IMR_RXDUE | /* Receive buffer unavailable */ DC_IMR_TXFUE); /* Transmit fifo underrun enabled */ #define DC_STATUS_MASK (DC_ISR_RX_DONE | DC_ISR_TX_DONE | DC_ISR_ABNORMAL | DC_ISR_TX_UNDERRUN | DC_ISR_RX_NOBUF) #if (DEBUG_DAVICOM) DEBUG_ERROR("davicom_init: start rcv and xmit", NOVAR, 0, 0); #endif /* ************************************************************ * write CR6 to set global parameters and start both receive and transmit * processes; start receive * DC_MODE_TX_SC - start transmitter * DC_MODE_RX_RC - start receiver * DC_MODE_PAM - receive multicasts * DC_MODE_1_PKT */ WRITE_CR(DC_MODE_CR6, (1<<26) | DC_MODE_SFT_XMIT | /* wait with transmit until all data is in fifo (disable threshold) */ DC_MODE_1_PKT | /* only one packet in transmit fifo */ (3<<14) | /* max threshohld */ DC_MODE_TX_SC | /* start transmit */ /* DC_MODE_PAM | // receive multicasts */ DC_MODE_RX_RC | /* start receive */ 0); /* ************************************************************ */ softc->timer.func = timeout; /* routine to execute every second */ softc->timer.arg = softc; ebs_set_timer(&softc->timer, 1, TRUE); ebs_start_timer(&softc->timer); return(TRUE); }