This commit is contained in:
Jia-Ju Bai 2017-01-23 10:54:23 +00:00 committed by GitHub
commit ee73d52f74
5 changed files with 668 additions and 646 deletions

View File

@ -10,9 +10,11 @@ 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>
Something can be improved: Revision 1.2 2017/1/12
1. MII, WOL functions are not adequately defined and used. Modification: Restructure the code and correct function order in initialization
2. Link status report does not work well. Authored by Jia-Ju Bai <baijiaju1990@163.com>
3. Ethernet address can not be modified at present.
4. Programming PHY registers and EEPROM are not adequately used. Something can be improved:
5. Dump interfaces are not provided. 1. Link status report is not detailed.
2. Ethernet address can not be modified at present.
3. Dump interfaces are not provided.

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("vt6105: 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 vt_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("vt6105: 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 vt_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("vt6105: sys_inl failed: %d\n", r); printf("NDR: sys_inl failed: %d\n", r);
#endif #endif
return value; return value;
} }
#define vt_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("vt6105: sys_outb failed: %d\n", r); printf("NDR: sys_outb failed: %d\n", r);
#endif #endif
} }
#define vt_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("vt6105: sys_outw failed: %d\n", r); printf("NDR: sys_outw failed: %d\n", r);
#endif #endif
} }
#define vt_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("vt6105: sys_outl failed: %d\n", r); printf("NDR: sys_outl failed: %d\n", r);
#endif #endif
} }
#define vt_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,16 +1,17 @@
service vt6105 service vt6105
{ {
type net; type net;
descr "VIA Technology 6105/6106S Ethernet Card"; descr "VIA Technology 6105/6106S Ethernet Card";
system system
UMAP # 14 UMAP # 14
IRQCTL # 19 IRQCTL # 19
DEVIO # 21 DEVIO # 21
; ;
pci device 1106:3053; pci device 1106:3053;
pci device 1106:3106; pci device 1106:3106;
ipc ipc
SYSTEM pm rs log tty ds vm SYSTEM pm rs log tty ds vm
pci inet lwip amddev pci inet lwip amddev
; ;
}; };

View File

@ -1,110 +1,110 @@
#ifndef _vt_H #ifndef _NDR_H
#define _vt_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 0x06
#define REG_ISR 0x0c
#define REG_IMR 0x0e
#define REG_RX_DESC_BASEL 0x18
#define REG_TX_DESC_BASEL 0x1c
#ifdef DESC_BASE_DMA64 #define DRIVER_NAME "VT6105"
#define REG_RX_DESC_BASEU 0
#define REG_TX_DESC_BASEU 0
#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 0x3ffc #define INTR_STS_LINK 0x4000
#define INTR_ISR_LINK_EVENT 0x4000 #define INTR_STS_RX 0x0001
#define INTR_ISR_RX_DONE 0x0001 #define INTR_STS_TX 0x0002
#define INTR_ISR_TX_DONE 0x0002
#define INTR_ISR_CLEAR 0xbfbf
#define INTR_IMR_ENABLE 0xfeff
#define INTR_IMR_DISABLE 0x0000
/* Descriptor status */
#define DESC_STATUS_RX_RECV_ERR 0x000000bf
#define DESC_STATUS_RX_RECV_CLEAR 0x80000000
#define DESC_STATUS_TX_SEND_ERR 0x00008f10
#define DESC_STATUS_TX_SEND_CLEAR 0x00000000
/* Rx mode */
#define RCR_UNICAST 0x10
#define RCR_MULTICAST 0x04
#define RCR_BROADCAST 0x08
/* 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 64
#define TX_DESC_NUM 64 /* 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 DESC_OWN 0x80000000 #define DESC_OWN 0x80000000
#define DESC_FIRST 0x00000200 #define DESC_FIRST 0x00000200
#define DESC_LAST 0x00000100 #define DESC_LAST 0x00000100
#define DESC_RX_LENMASK 0x7fff0000 #define DESC_RX_LENMASK 0x7fff0000
#define DESC_RX_OK 0x00008000 #define DESC_RX_ERROR 0x000000bf
#define DESC_RX_NORMAL (DESC_FIRST | DESC_LAST) #define DESC_RX_NORMAL (DESC_FIRST | DESC_LAST)
#define DESC_TX_ERROR 0x00008f10
#define REG_ADDR 0x00 #define REG_ADDR 0x00
#define REG_TCR 0x07 #define REG_RCR 0x06
#define REG_CR 0x08 #define REG_TCR 0x07
#define REG_BCR0 0x6e #define REG_CR 0x08
#define REG_MCR1 0x81 #define REG_IMR 0x0e
#define REG_STICK 0x83 #define REG_ISR 0x0c
#define REG_MII_CFG 0x6c #define REG_RX_DESC_BASE 0x18
#define REG_MII_CR 0x70 #define REG_TX_DESC_BASE 0x1c
#define REG_MII_ADDR 0x71 #define REG_MII_PHY 0x6c
#define REG_MII_DATA 0x72 #define REG_BCR 0x6e
#define REG_WOL_SET 0xa4 #define REG_MII_CR 0x70
#define REG_WOLC_SET 0xa7 #define REG_MII_REG 0x71
#define REG_MII_DATA 0x72
#define REG_MCR 0x81
#define REG_STICK 0x83
#define CMD_START 0x0002 #define CMD_START 0x0002
#define CMD_STOP 0x0004 #define CMD_STOP 0x0004
#define CMD_RX_ON 0x0008 #define CMD_RX_ON 0x0008
#define CMD_TX_ON 0x0010 #define CMD_TX_ON 0x0010
#define CMD_TX_DEMAND 0x0020 #define CMD_TX_DEMAND 0x0020
#define CMD_RX_DEMAND 0x0040 #define CMD_RX_DEMAND 0x0040
#define CMD_FDUPLEX 0x0400 #define CMD_FDUPLEX 0x0400
#define CMD_NO_POLL 0x0800 #define CMD_NO_POLL 0x0800
#define CMD_RESET 0x8000 #define CMD_RESET 0x8000
#define CMD_INTR_ENABLE 0xfeff
#define CMD_RCR_UNICAST 0x10
#define CMD_RCR_MULTICAST 0x04
#define CMD_RCR_BROADCAST 0x08
#define INTR_STS_CLEAR 0xbfbf
#define LINK_STATUS 0x0004
/* ======= Data Descriptor ======= */ /* ======= Data Descriptor ======= */
typedef struct vt_desc { typedef struct NDR_desc {
u32_t status; u32_t status;
u32_t length; u32_t length;
u32_t addr; u32_t addr;
u32_t next; u32_t next;
} vt_desc; } NDR_desc;
/* Driver Data Structure */ /* Driver Data Structure */
typedef struct vt_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;
@ -115,9 +115,7 @@ typedef struct vt_driver {
struct { struct {
phys_bytes buf_dma; phys_bytes buf_dma;
char *buf; char *buf;
} rx[RX_DESC_NUM]; } rx[RX_BUFFER_NUM];
vt_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;
@ -126,15 +124,17 @@ typedef struct vt_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];
vt_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;
} vt_driver;
#endif #endif