IP1000: Restructure the code and correct function order in initialization

Change-Id: I7c887a777205ea0ae38b4ef1830535d035c5a976
This commit is contained in:
Jia-Ju Bai 2017-01-15 03:20:36 +00:00 committed by David van Moolenbroek
parent 72e11e2789
commit 3afdc1200b
4 changed files with 664 additions and 671 deletions

View File

@ -1,11 +1,8 @@
The ip1000 driver is for IC Plus 1000A/Family (ST1023) Ethernet card. The ip1000 driver is for IC Plus 1000A/Family (ST1023) Ethernet card.
This driver is referred to Minix(3.4.0) vt6105 driver, This driver is referred to Minix(3.4.0) rtl8169 driver,
Linux(4.2.1) ipg driver and IP1000A LF-DS-R08 datasheet. Linux(4.2.1) ipg driver and IP1000A LF-DS-R08 datasheet.
The supported PCI number is 13F0:1023:13F0:1023.
Maybe the Ethernet cards of other PCI numbers for IC Plus can be supported.
Revision 1.0 2016/11/02 Revision 1.0 2016/11/02
Authored by Jia-Ju Bai <baijiaju1990@163.com> Authored by Jia-Ju Bai <baijiaju1990@163.com>
@ -13,7 +10,10 @@ Revision 1.1 2016/11/12
Modification: Remove and rewrite Linux-derived code Modification: Remove and rewrite Linux-derived code
Authored by Jia-Ju Bai <baijiaju1990@163.com> Authored by Jia-Ju Bai <baijiaju1990@163.com>
Revision 1.2 2017/1/12
Modification: Restructure the code and correct function order in initialization
Authored by Jia-Ju Bai <baijiaju1990@163.com>
Something can be improved: Something can be improved:
1. Ethernet address can not be modified at present. 1. Ethernet address can not be modified at present.
2. Dump interfaces are not provided. 2. Dump interfaces are not provided.
3. The device needs serveral seconds to work normally after initialization.

View File

@ -9,76 +9,76 @@
static u8_t my_inb(u32_t port) { static u8_t my_inb(u32_t port) {
u32_t value; u32_t value;
int r; int r;
#ifdef DMA_REG_MODE #ifdef DMA_BASE_IOMAP
value = *(u8_t *)(port); value = *(volatile u8_t *)(port);
#else #else
if ((r = sys_inb(port, &value)) != OK) if ((r = sys_inb(port, &value)) != OK)
printf("ip1000: sys_inb failed: %d\n", r); printf("NDR: sys_inb failed: %d\n", r);
#endif #endif
return (u8_t)value; return (u8_t)value;
} }
#define ic_in8(port, offset) (my_inb((port) + (offset))) #define ndr_in8(port, offset) (my_inb((port) + (offset)))
static u16_t my_inw(u32_t port) { static u16_t my_inw(u32_t port) {
u32_t value; u32_t value;
int r; int r;
#ifdef DMA_REG_MODE #ifdef DMA_BASE_IOMAP
value = *(u16_t *)(port); value = *(volatile u16_t *)(port);
#else #else
if ((r = sys_inw(port, &value)) != OK) if ((r = sys_inw(port, &value)) != OK)
printf("ip1000: sys_inw failed: %d\n", r); printf("NDR: sys_inw failed: %d\n", r);
#endif #endif
return (u16_t)value; return (u16_t)value;
} }
#define ic_in16(port, offset) (my_inw((port) + (offset))) #define ndr_in16(port, offset) (my_inw((port) + (offset)))
static u32_t my_inl(u32_t port) { static u32_t my_inl(u32_t port) {
u32_t value; u32_t value;
int r; int r;
#ifdef DMA_REG_MODE #ifdef DMA_BASE_IOMAP
value = *(u32_t *)(port); value = *(volatile u32_t *)(port);
#else #else
if ((r = sys_inl(port, &value)) != OK) if ((r = sys_inl(port, &value)) != OK)
printf("ip1000: sys_inl failed: %d\n", r); printf("NDR: sys_inl failed: %d\n", r);
#endif #endif
return value; return value;
} }
#define ic_in32(port, offset) (my_inl((port) + (offset))) #define ndr_in32(port, offset) (my_inl((port) + (offset)))
static void my_outb(u32_t port, u8_t value) { static void my_outb(u32_t port, u32_t value) {
int r; int r;
#ifdef DMA_REG_MODE #ifdef DMA_BASE_IOMAP
*(u8_t *)(port) = value; *(volatile u8_t *)(port) = value;
#else #else
if ((r = sys_outb(port, value)) != OK) if ((r = sys_outb(port, (u8_t)value)) != OK)
printf("ip1000: sys_outb failed: %d\n", r); printf("NDR: sys_outb failed: %d\n", r);
#endif #endif
} }
#define ic_out8(port, offset, value) \ #define ndr_out8(port, offset, value) \
(my_outb(((port) + (offset)), (value))) (my_outb(((port) + (offset)), (value)))
static void my_outw(u32_t port, u16_t value) { static void my_outw(u32_t port, u32_t value) {
int r; int r;
#ifdef DMA_REG_MODE #ifdef DMA_BASE_IOMAP
*(u16_t *)(port) = value; *(volatile u16_t *)(port) = value;
#else #else
if ((r = sys_outw(port, value)) != OK) if ((r = sys_outw(port, (u16_t)value)) != OK)
printf("ip1000: sys_outw failed: %d\n", r); printf("NDR: sys_outw failed: %d\n", r);
#endif #endif
} }
#define ic_out16(port, offset, value) \ #define ndr_out16(port, offset, value) \
(my_outw(((port) + (offset)), (value))) (my_outw(((port) + (offset)), (value)))
static void my_outl(u16_t port, u32_t value) { static void my_outl(u32_t port, u32_t value) {
int r; int r;
#ifdef DMA_REG_MODE #ifdef DMA_BASE_IOMAP
*(u32_t *)(port) = value; *(volatile u32_t *)(port) = value;
#else #else
if ((r = sys_outl(port, value)) != OK) if ((r = sys_outl(port, value)) != OK)
printf("ip1000: sys_outl failed: %d\n", r); printf("NDR: sys_outl failed: %d\n", r);
#endif #endif
} }
#define ic_out32(port, offset, value) \ #define ndr_out32(port, offset, value) \
(my_outl(((port) + (offset)), (value))) (my_outl(((port) + (offset)), (value)))
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -1,59 +1,46 @@
#ifndef _ic_H #ifndef _NDR_H
#define _ic_H #define _NDR_H
#include <minix/drivers.h>
/* ======= General Parameter ======= */ /* ======= General Parameter ======= */
/* Global configure */ /* Global configure */
#define DESC_BASE64
/* Key internal register */ #include <minix/drivers.h>
#define REG_RCR 0x88
#define REG_ISR 0x5a
#define REG_IMR 0x5c
#define REG_RX_DESC_BASEL 0x1c
#define REG_TX_DESC_BASEL 0x10
#ifdef DESC_BASE_DMA64 #define DRIVER_NAME "IP1000"
#define REG_RX_DESC_BASEU 0x20
#define REG_TX_DESC_BASEU 0x14
#endif
/* Key internal register width */ /* Rx/Tx buffer parameter */
#define WIDTH_REG_RCR 8 #define RX_BUF_SIZE 1536
#define WIDTH_REG_ISR 16 #define TX_BUF_SIZE 1536
#define WIDTH_REG_IMR 16 #define RX_BUFFER_NUM 64
#define TX_BUFFER_NUM 64
/* Interrupt statu and command */ /* Interrupt status */
#define INTR_ISR_ERR 0x0002 #define INTR_STS_LINK 0x0100
#define INTR_ISR_LINK_EVENT 0x0100 #define INTR_STS_RX 0x0400
#define INTR_ISR_RX_DONE 0x0400 #define INTR_STS_TX 0x0200
#define INTR_ISR_TX_DONE 0x0200
#define INTR_ISR_CLEAR 0x0000
#define INTR_IMR_ENABLE 0x17f6
#define INTR_IMR_DISABLE 0x0000
/* Descriptor status */
#define DESC_STATUS_RX_RECV_ERR 0x00000000003f0000ULL
#define DESC_STATUS_RX_RECV_CLEAR 0x0000000000000000ULL
#define DESC_STATUS_TX_SEND_ERR 0x0000000000000000ULL
#define DESC_STATUS_TX_SEND_CLEAR 0x0000000000000000ULL
/* Rx mode */
#define RCR_UNICAST 0x01
#define RCR_MULTICAST 0x02
#define RCR_BROADCAST 0x04
/* Link status */ /* Link status */
#define LINK_UP 1 #define LINK_UP 1
#define LINK_DOWN 0 #define LINK_DOWN 0
#define LINK_UNKNOWN -1 #define LINK_UNKNOWN -1
/* Basic Rx/Tx parameters */ /* Interrupt control */
#define RX_BUF_SIZE 1536 #define INTR_ENABLE 1
#define TX_BUF_SIZE 1536 #define INTR_DISABLE 0
#define RX_DESC_NUM 256
#define TX_DESC_NUM 256 /* Rx status */
#define RX_ERROR 1
#define RX_OK 0
#define RX_SUSPEND -1
/* Tx status */
#define TX_ERROR 1
#define TX_OK 0
#define TX_SUSPEND -1
/* Rx/Tx control */
#define RX_TX_ENABLE 1
#define RX_TX_DISABLE 0
/* ======= Self-defined Parameter ======= */ /* ======= Self-defined Parameter ======= */
#define RFI_FRAG_LEN 0xffff000000000000ULL #define RFI_FRAG_LEN 0xffff000000000000ULL
@ -61,6 +48,7 @@
#define RFS_FRAME_START 0x0000000020000000ULL #define RFS_FRAME_START 0x0000000020000000ULL
#define RFS_FRAME_END 0x0000000040000000ULL #define RFS_FRAME_END 0x0000000040000000ULL
#define RFS_RFD_DONE 0x0000000080000000ULL #define RFS_RFD_DONE 0x0000000080000000ULL
#define RFS_ERROR 0x00000000003f0000ULL
#define RFS_NORMAL (RFS_RFD_DONE | RFS_FRAME_START | RFS_FRAME_END) #define RFS_NORMAL (RFS_RFD_DONE | RFS_FRAME_START | RFS_FRAME_END)
#define TFI_FRAG_LEN 0xffff000000000000ULL #define TFI_FRAG_LEN 0xffff000000000000ULL
@ -71,9 +59,13 @@
#define TFS_TFD_DONE 0x0000000080000000ULL #define TFS_TFD_DONE 0x0000000080000000ULL
#define REG_DMA_CTRL 0x00 #define REG_DMA_CTRL 0x00
#define REG_TX_DESC_BASEL 0x10
#define REG_TX_DESC_BASEU 0x14
#define REG_TX_DMA_BTH 0x18 #define REG_TX_DMA_BTH 0x18
#define REG_TX_DMA_UTH 0x19 #define REG_TX_DMA_UTH 0x19
#define REG_TX_DMA_PERIOD 0x1a #define REG_TX_DMA_PERIOD 0x1a
#define REG_RX_DESC_BASEL 0x1c
#define REG_RX_DESC_BASEU 0x20
#define REG_RX_DMA_BTH 0x24 #define REG_RX_DMA_BTH 0x24
#define REG_RX_DMA_UTH 0x25 #define REG_RX_DMA_UTH 0x25
#define REG_RX_DMA_PERIOD 0x26 #define REG_RX_DMA_PERIOD 0x26
@ -82,6 +74,8 @@
#define REG_FLOW_ON_TH 0x3e #define REG_FLOW_ON_TH 0x3e
#define REG_EEPROM_DATA 0x48 #define REG_EEPROM_DATA 0x48
#define REG_EEPROM_CTRL 0x4a #define REG_EEPROM_CTRL 0x4a
#define REG_ISR 0x5a
#define REG_IMR 0x5c
#define REG_MAC_CTRL 0x6c #define REG_MAC_CTRL 0x6c
#define REG_PHY_SET 0x75 #define REG_PHY_SET 0x75
#define REG_PHY_CTRL 0x76 #define REG_PHY_CTRL 0x76
@ -89,6 +83,7 @@
#define REG_STA_ADDR1 0x7a #define REG_STA_ADDR1 0x7a
#define REG_STA_ADDR2 0x7c #define REG_STA_ADDR2 0x7c
#define REG_MAX_FRAME 0x86 #define REG_MAX_FRAME 0x86
#define REG_RCR 0x88
#define AC_LED_MODE 0x00004000 #define AC_LED_MODE 0x00004000
#define AC_GB_RESET 0x00010000 #define AC_GB_RESET 0x00010000
@ -121,6 +116,12 @@
#define PC_LINK_SPEED100 0x80 #define PC_LINK_SPEED100 0x80
#define PC_LINK_SPEED1000 0xc0 #define PC_LINK_SPEED1000 0xc0
#define CMD_INTR_ENABLE 0x17e6
#define CMD_RCR_UNICAST 0x01
#define CMD_RCR_MULTICAST 0x02
#define CMD_RCR_BROADCAST 0x04
#define CMD_TX_START 0x1000
#define EC_READ 0x0200 #define EC_READ 0x0200
#define EC_BUSY 0x8000 #define EC_BUSY 0x8000
@ -136,22 +137,26 @@ static u16_t PhyParam[] = {
}; };
/* ======= Data Descriptor ======= */ /* ======= Data Descriptor ======= */
typedef struct ic_desc { typedef struct NDR_desc {
u64_t next;; u64_t next;
u64_t status;; u64_t status;
u64_t frag_info;; u64_t frag_info;
} ic_desc; } NDR_desc;
/* Driver Data Structure */ /* Driver Data Structure */
typedef struct ic_driver { typedef struct NDR_driver {
u32_t base_addr; /* Base address */ char *dev_name; /* Device name */
int revision; /* Revision ID */ u16_t vid, did; /* Vendor and device ID */
int irq; /* IRQ number */ u32_t devind; /* Device index */
u32_t base[6]; /* Base address */
char irq; /* IRQ number */
char revision; /* Revision ID */
int mode; int mode;
int link; /* Whether link-up */ int link; /* Whether link-up */
int recv_flag; /* Receive flag */ int recv_flag; /* Receive flag */
int send_flag; /* Send flag */ int send_flag; /* Send flag */
int tx_busy; int tx_busy; /* Whether Tx is busy */
/* Buffer */ /* Buffer */
size_t buf_size; size_t buf_size;
@ -162,9 +167,7 @@ typedef struct ic_driver {
struct { struct {
phys_bytes buf_dma; phys_bytes buf_dma;
char *buf; char *buf;
} rx[RX_DESC_NUM]; } rx[RX_BUFFER_NUM];
ic_desc *rx_desc; /* Rx descriptor buffer */
phys_bytes rx_desc_dma; /* Rx descriptor DMA buffer */
/* Tx data */ /* Tx data */
int tx_head; int tx_head;
@ -173,15 +176,17 @@ typedef struct ic_driver {
int busy; int busy;
phys_bytes buf_dma; phys_bytes buf_dma;
char *buf; char *buf;
} tx[TX_DESC_NUM]; } tx[TX_BUFFER_NUM];
ic_desc *tx_desc; /* Tx descriptor buffer */ int tx_busy_num; /* Number of busy Tx buffer */
NDR_desc *rx_desc; /* Rx descriptor buffer */
phys_bytes rx_desc_dma; /* Rx descriptor DMA buffer */
NDR_desc *tx_desc; /* Tx descriptor buffer */
phys_bytes tx_desc_dma; /* Tx descriptor DMA buffer */ phys_bytes tx_desc_dma; /* Tx descriptor DMA buffer */
int tx_busy_num; /* Number of busy Tx descriptors */
int hook; /* IRQ hook id at kernel */ int hook; /* IRQ hook id at kernel */
eth_stat_t stat; eth_stat_t stat; /* Ethernet status */
char name[50]; /* Driver name */
char name[20]; } NDR_driver;
} ic_driver;
#endif #endif