VT6105: Restructure the code and correct function order in initialization

Change-Id: Ibbc8f835174349501e74dde7163c234effb34bc8
This commit is contained in:
Jia-Ju Bai 2017-01-15 03:31:13 +00:00 committed by David van Moolenbroek
parent 3afdc1200b
commit c28d8fefcf
4 changed files with 643 additions and 622 deletions

View File

@ -10,9 +10,11 @@ Revision 1.1 2016/11/12
Modification: Remove and rewrite Linux-derived code
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:
1. MII, WOL functions are not adequately defined and used.
2. Link status report does not work well.
3. Ethernet address can not be modified at present.
4. Programming PHY registers and EEPROM are not adequately used.
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) {
u32_t value;
int r;
#ifdef DMA_REG_MODE
value = *(u8_t *)(port);
#ifdef DMA_BASE_IOMAP
value = *(volatile u8_t *)(port);
#else
if ((r = sys_inb(port, &value)) != OK)
printf("vt6105: sys_inb failed: %d\n", r);
printf("NDR: sys_inb failed: %d\n", r);
#endif
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) {
u32_t value;
int r;
#ifdef DMA_REG_MODE
value = *(u16_t *)(port);
#ifdef DMA_BASE_IOMAP
value = *(volatile u16_t *)(port);
#else
if ((r = sys_inw(port, &value)) != OK)
printf("vt6105: sys_inw failed: %d\n", r);
printf("NDR: sys_inw failed: %d\n", r);
#endif
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) {
u32_t value;
int r;
#ifdef DMA_REG_MODE
value = *(u32_t *)(port);
#ifdef DMA_BASE_IOMAP
value = *(volatile u32_t *)(port);
#else
if ((r = sys_inl(port, &value)) != OK)
printf("vt6105: sys_inl failed: %d\n", r);
printf("NDR: sys_inl failed: %d\n", r);
#endif
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;
#ifdef DMA_REG_MODE
*(u8_t *)(port) = value;
#ifdef DMA_BASE_IOMAP
*(volatile u8_t *)(port) = value;
#else
if ((r = sys_outb(port, value)) != OK)
printf("vt6105: sys_outb failed: %d\n", r);
if ((r = sys_outb(port, (u8_t)value)) != OK)
printf("NDR: sys_outb failed: %d\n", r);
#endif
}
#define vt_out8(port, offset, value) \
#define ndr_out8(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;
#ifdef DMA_REG_MODE
*(u16_t *)(port) = value;
#ifdef DMA_BASE_IOMAP
*(volatile u16_t *)(port) = value;
#else
if ((r = sys_outw(port, value)) != OK)
printf("vt6105: sys_outw failed: %d\n", r);
if ((r = sys_outw(port, (u16_t)value)) != OK)
printf("NDR: sys_outw failed: %d\n", r);
#endif
}
#define vt_out16(port, offset, value) \
#define ndr_out16(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;
#ifdef DMA_REG_MODE
*(u32_t *)(port) = value;
#ifdef DMA_BASE_IOMAP
*(volatile u32_t *)(port) = value;
#else
if ((r = sys_outl(port, value)) != OK)
printf("vt6105: sys_outl failed: %d\n", r);
printf("NDR: sys_outl failed: %d\n", r);
#endif
}
#define vt_out32(port, offset, value) \
#define ndr_out32(port, offset, value) \
(my_outl(((port) + (offset)), (value)))
#endif

File diff suppressed because it is too large Load Diff

View File

@ -1,110 +1,110 @@
#ifndef _vt_H
#define _vt_H
#include <minix/drivers.h>
#ifndef _NDR_H
#define _NDR_H
/* ======= General Parameter ======= */
/* Global configure */
#define DESC_BASE64
/* Key internal register */
#define REG_RCR 0x06
#define REG_ISR 0x0c
#define REG_IMR 0x0e
#define REG_RX_DESC_BASEL 0x18
#define REG_TX_DESC_BASEL 0x1c
#include <minix/drivers.h>
#ifdef DESC_BASE_DMA64
#define REG_RX_DESC_BASEU 0
#define REG_TX_DESC_BASEU 0
#endif
#define DRIVER_NAME "VT6105"
/* Key internal register width */
#define WIDTH_REG_RCR 8
#define WIDTH_REG_ISR 16
#define WIDTH_REG_IMR 16
/* Rx/Tx buffer parameter */
#define RX_BUF_SIZE 1536
#define TX_BUF_SIZE 1536
#define RX_BUFFER_NUM 64
#define TX_BUFFER_NUM 64
/* Interrupt statu and command */
#define INTR_ISR_ERR 0x3ffc
#define INTR_ISR_LINK_EVENT 0x4000
#define INTR_ISR_RX_DONE 0x0001
#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
/* Interrupt status */
#define INTR_STS_LINK 0x4000
#define INTR_STS_RX 0x0001
#define INTR_STS_TX 0x0002
/* Link status */
#define LINK_UP 1
#define LINK_DOWN 0
#define LINK_UNKNOWN -1
/* Basic Rx/Tx parameters */
#define RX_BUF_SIZE 1536
#define TX_BUF_SIZE 1536
#define RX_DESC_NUM 64
#define TX_DESC_NUM 64
/* Interrupt control */
#define INTR_ENABLE 1
#define INTR_DISABLE 0
/* 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 ======= */
#define DESC_OWN 0x80000000
#define DESC_FIRST 0x00000200
#define DESC_LAST 0x00000100
#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_TX_ERROR 0x00008f10
#define REG_ADDR 0x00
#define REG_TCR 0x07
#define REG_CR 0x08
#define REG_BCR0 0x6e
#define REG_MCR1 0x81
#define REG_STICK 0x83
#define REG_MII_CFG 0x6c
#define REG_MII_CR 0x70
#define REG_MII_ADDR 0x71
#define REG_MII_DATA 0x72
#define REG_WOL_SET 0xa4
#define REG_WOLC_SET 0xa7
#define REG_ADDR 0x00
#define REG_RCR 0x06
#define REG_TCR 0x07
#define REG_CR 0x08
#define REG_IMR 0x0e
#define REG_ISR 0x0c
#define REG_RX_DESC_BASE 0x18
#define REG_TX_DESC_BASE 0x1c
#define REG_MII_PHY 0x6c
#define REG_BCR 0x6e
#define REG_MII_CR 0x70
#define REG_MII_REG 0x71
#define REG_MII_DATA 0x72
#define REG_MCR 0x81
#define REG_STICK 0x83
#define CMD_START 0x0002
#define CMD_STOP 0x0004
#define CMD_RX_ON 0x0008
#define CMD_TX_ON 0x0010
#define CMD_TX_DEMAND 0x0020
#define CMD_RX_DEMAND 0x0040
#define CMD_FDUPLEX 0x0400
#define CMD_NO_POLL 0x0800
#define CMD_RESET 0x8000
#define CMD_START 0x0002
#define CMD_STOP 0x0004
#define CMD_RX_ON 0x0008
#define CMD_TX_ON 0x0010
#define CMD_TX_DEMAND 0x0020
#define CMD_RX_DEMAND 0x0040
#define CMD_FDUPLEX 0x0400
#define CMD_NO_POLL 0x0800
#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 ======= */
typedef struct vt_desc {
typedef struct NDR_desc {
u32_t status;
u32_t length;
u32_t addr;
u32_t next;
} vt_desc;
} NDR_desc;
/* Driver Data Structure */
typedef struct vt_driver {
u32_t base_addr; /* Base address */
int revision; /* Revision ID */
int irq; /* IRQ number */
typedef struct NDR_driver {
char *dev_name; /* Device name */
u16_t vid, did; /* Vendor and device ID */
u32_t devind; /* Device index */
u32_t base[6]; /* Base address */
char irq; /* IRQ number */
char revision; /* Revision ID */
int mode;
int link; /* Whether link-up */
int recv_flag; /* Receive flag */
int send_flag; /* Send flag */
int tx_busy;
int tx_busy; /* Whether Tx is busy */
/* Buffer */
size_t buf_size;
@ -115,9 +115,7 @@ typedef struct vt_driver {
struct {
phys_bytes buf_dma;
char *buf;
} rx[RX_DESC_NUM];
vt_desc *rx_desc; /* Rx descriptor buffer */
phys_bytes rx_desc_dma; /* Rx descriptor DMA buffer */
} rx[RX_BUFFER_NUM];
/* Tx data */
int tx_head;
@ -126,15 +124,17 @@ typedef struct vt_driver {
int busy;
phys_bytes buf_dma;
char *buf;
} tx[TX_DESC_NUM];
vt_desc *tx_desc; /* Tx descriptor buffer */
} tx[TX_BUFFER_NUM];
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 */
int tx_busy_num; /* Number of busy Tx descriptors */
int hook; /* IRQ hook id at kernel */
eth_stat_t stat;
char name[20];
} vt_driver;
int hook; /* IRQ hook id at kernel */
eth_stat_t stat; /* Ethernet status */
char name[50]; /* Driver name */
} NDR_driver;
#endif