IP1000: Restructure the code and correct function order in initialization
Change-Id: I7c887a777205ea0ae38b4ef1830535d035c5a976
This commit is contained in:
parent
72e11e2789
commit
3afdc1200b
@ -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.
|
|
||||||
|
@ -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
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user