Add the driver for IC Plus 1000A Ethernet card
Change-Id: I9ac119c6285bc63a8b795b44d9ab7d245d9a8832
This commit is contained in:
parent
8dc24c0650
commit
8d98f2e579
@ -15,6 +15,7 @@
|
||||
./etc/system.conf.d/es1371 minix-base
|
||||
./etc/system.conf.d/e1000 minix-base
|
||||
./etc/system.conf.d/fxp minix-base
|
||||
./etc/system.conf.d/ip1000 minix-base
|
||||
./etc/system.conf.d/lance minix-base
|
||||
./etc/system.conf.d/printer minix-base
|
||||
./etc/system.conf.d/rtl8139 minix-base
|
||||
@ -41,6 +42,7 @@
|
||||
./service/floppy minix-base
|
||||
./service/fxp minix-base
|
||||
./service/hgfs minix-base
|
||||
./service/ip1000 minix-base
|
||||
./service/lance minix-base
|
||||
./service/pci minix-base
|
||||
./service/pckbd minix-base
|
||||
|
@ -27,6 +27,7 @@
|
||||
./usr/libdata/debug/service/floppy.debug minix-debug debug
|
||||
./usr/libdata/debug/service/fxp.debug minix-debug debug
|
||||
./usr/libdata/debug/service/hgfs.debug minix-debug debug
|
||||
./usr/libdata/debug/service/ip1000.debug minix-debug debug
|
||||
./usr/libdata/debug/service/lance.debug minix-debug debug
|
||||
./usr/libdata/debug/service/pci.debug minix-debug debug
|
||||
./usr/libdata/debug/service/pckbd.debug minix-debug debug
|
||||
|
@ -8,6 +8,7 @@ SUBDIR+= dp8390
|
||||
SUBDIR+= dpeth
|
||||
SUBDIR+= e1000
|
||||
SUBDIR+= fxp
|
||||
SUBDIR+= ip1000
|
||||
SUBDIR+= lance
|
||||
SUBDIR+= rtl8139
|
||||
SUBDIR+= rtl8169
|
||||
|
14
minix/drivers/net/ip1000/Makefile
Normal file
14
minix/drivers/net/ip1000/Makefile
Normal file
@ -0,0 +1,14 @@
|
||||
# Makefile for the Ethernet drivers
|
||||
PROG= ip1000
|
||||
SRCS= ip1000.c
|
||||
|
||||
FILES=${PROG}.conf
|
||||
FILESNAME=${PROG}
|
||||
FILESDIR= /etc/system.conf.d
|
||||
|
||||
DPADD+= ${LIBNETDRIVER} ${LIBSYS}
|
||||
LDADD+= -lnetdriver -lsys
|
||||
|
||||
CPPFLAGS+= -I${NETBSDSRCDIR}/minix
|
||||
|
||||
.include <minix.service.mk>
|
19
minix/drivers/net/ip1000/README
Normal file
19
minix/drivers/net/ip1000/README
Normal file
@ -0,0 +1,19 @@
|
||||
The ip1000 driver is for IC Plus 1000A/Family (ST1023) Ethernet card.
|
||||
|
||||
This driver is referred to Minix(3.4.0) vt6105 driver,
|
||||
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
|
||||
Authored by Jia-Ju Bai <baijiaju1990@163.com>
|
||||
|
||||
Revision 1.1 2016/11/12
|
||||
Modification: Remove and rewrite Linux-derived code
|
||||
Authored by Jia-Ju Bai <baijiaju1990@163.com>
|
||||
|
||||
Something can be improved:
|
||||
1. Ethernet address can not be modified at present.
|
||||
2. Dump interfaces are not provided.
|
||||
3. The device needs serveral seconds to work normally after initialization.
|
84
minix/drivers/net/ip1000/io.h
Normal file
84
minix/drivers/net/ip1000/io.h
Normal file
@ -0,0 +1,84 @@
|
||||
#ifndef _IO_H
|
||||
#define _IO_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <minix/syslib.h>
|
||||
#include "ip1000.h"
|
||||
|
||||
/* I/O function */
|
||||
static u8_t my_inb(u32_t port) {
|
||||
u32_t value;
|
||||
int r;
|
||||
#ifdef DMA_REG_MODE
|
||||
value = *(u8_t *)(port);
|
||||
#else
|
||||
if ((r = sys_inb(port, &value)) != OK)
|
||||
printf("ip1000: sys_inb failed: %d\n", r);
|
||||
#endif
|
||||
return (u8_t)value;
|
||||
}
|
||||
#define ic_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);
|
||||
#else
|
||||
if ((r = sys_inw(port, &value)) != OK)
|
||||
printf("ip1000: sys_inw failed: %d\n", r);
|
||||
#endif
|
||||
return (u16_t)value;
|
||||
}
|
||||
#define ic_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);
|
||||
#else
|
||||
if ((r = sys_inl(port, &value)) != OK)
|
||||
printf("ip1000: sys_inl failed: %d\n", r);
|
||||
#endif
|
||||
return value;
|
||||
}
|
||||
#define ic_in32(port, offset) (my_inl((port) + (offset)))
|
||||
|
||||
static void my_outb(u32_t port, u8_t value) {
|
||||
int r;
|
||||
#ifdef DMA_REG_MODE
|
||||
*(u8_t *)(port) = value;
|
||||
#else
|
||||
if ((r = sys_outb(port, value)) != OK)
|
||||
printf("ip1000: sys_outb failed: %d\n", r);
|
||||
#endif
|
||||
}
|
||||
#define ic_out8(port, offset, value) \
|
||||
(my_outb(((port) + (offset)), (value)))
|
||||
|
||||
static void my_outw(u32_t port, u16_t value) {
|
||||
int r;
|
||||
#ifdef DMA_REG_MODE
|
||||
*(u16_t *)(port) = value;
|
||||
#else
|
||||
if ((r = sys_outw(port, value)) != OK)
|
||||
printf("ip1000: sys_outw failed: %d\n", r);
|
||||
#endif
|
||||
}
|
||||
#define ic_out16(port, offset, value) \
|
||||
(my_outw(((port) + (offset)), (value)))
|
||||
|
||||
static void my_outl(u16_t port, u32_t value) {
|
||||
int r;
|
||||
#ifdef DMA_REG_MODE
|
||||
*(u32_t *)(port) = value;
|
||||
#else
|
||||
if ((r = sys_outl(port, value)) != OK)
|
||||
printf("ip1000: sys_outl failed: %d\n", r);
|
||||
#endif
|
||||
}
|
||||
#define ic_out32(port, offset, value) \
|
||||
(my_outl(((port) + (offset)), (value)))
|
||||
|
||||
#endif
|
1006
minix/drivers/net/ip1000/ip1000.c
Normal file
1006
minix/drivers/net/ip1000/ip1000.c
Normal file
File diff suppressed because it is too large
Load Diff
15
minix/drivers/net/ip1000/ip1000.conf
Normal file
15
minix/drivers/net/ip1000/ip1000.conf
Normal file
@ -0,0 +1,15 @@
|
||||
service ip1000
|
||||
{
|
||||
type net;
|
||||
descr "IC Plus 1000A Ethernet Card";
|
||||
system
|
||||
UMAP # 14
|
||||
IRQCTL # 19
|
||||
DEVIO # 21
|
||||
;
|
||||
pci device 13f0:1023;
|
||||
ipc
|
||||
SYSTEM pm rs log tty ds vm
|
||||
pci inet lwip amddev
|
||||
;
|
||||
};
|
187
minix/drivers/net/ip1000/ip1000.h
Normal file
187
minix/drivers/net/ip1000/ip1000.h
Normal file
@ -0,0 +1,187 @@
|
||||
#ifndef _ic_H
|
||||
#define _ic_H
|
||||
|
||||
#include <minix/drivers.h>
|
||||
|
||||
/* ======= General Parameter ======= */
|
||||
/* Global configure */
|
||||
#define DESC_BASE64
|
||||
|
||||
/* Key internal register */
|
||||
#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 REG_RX_DESC_BASEU 0x20
|
||||
#define REG_TX_DESC_BASEU 0x14
|
||||
#endif
|
||||
|
||||
/* Key internal register width */
|
||||
#define WIDTH_REG_RCR 8
|
||||
#define WIDTH_REG_ISR 16
|
||||
#define WIDTH_REG_IMR 16
|
||||
|
||||
/* Interrupt statu and command */
|
||||
#define INTR_ISR_ERR 0x0002
|
||||
#define INTR_ISR_LINK_EVENT 0x0100
|
||||
#define INTR_ISR_RX_DONE 0x0400
|
||||
#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 */
|
||||
#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 256
|
||||
#define TX_DESC_NUM 256
|
||||
|
||||
/* ======= Self-defined Parameter ======= */
|
||||
#define RFI_FRAG_LEN 0xffff000000000000ULL
|
||||
#define RFS_FRAME_LEN 0x000000000000ffffULL
|
||||
#define RFS_FRAME_START 0x0000000020000000ULL
|
||||
#define RFS_FRAME_END 0x0000000040000000ULL
|
||||
#define RFS_RFD_DONE 0x0000000080000000ULL
|
||||
#define RFS_NORMAL (RFS_RFD_DONE | RFS_FRAME_START | RFS_FRAME_END)
|
||||
|
||||
#define TFI_FRAG_LEN 0xffff000000000000ULL
|
||||
#define TFS_FRAMEID 0x000000000000ffffULL
|
||||
#define TFS_WORD_ALIGN 0x0000000000030000ULL
|
||||
#define TFS_TX_DMA_INDICATE 0x0000000000800000ULL
|
||||
#define TFS_FRAG_COUNT 0x000000000f000000ULL
|
||||
#define TFS_TFD_DONE 0x0000000080000000ULL
|
||||
|
||||
#define REG_DMA_CTRL 0x00
|
||||
#define REG_TX_DMA_BTH 0x18
|
||||
#define REG_TX_DMA_UTH 0x19
|
||||
#define REG_TX_DMA_PERIOD 0x1a
|
||||
#define REG_RX_DMA_BTH 0x24
|
||||
#define REG_RX_DMA_UTH 0x25
|
||||
#define REG_RX_DMA_PERIOD 0x26
|
||||
#define REG_ASIC_CTRL 0x30
|
||||
#define REG_FLOW_OFF_TH 0x3c
|
||||
#define REG_FLOW_ON_TH 0x3e
|
||||
#define REG_EEPROM_DATA 0x48
|
||||
#define REG_EEPROM_CTRL 0x4a
|
||||
#define REG_MAC_CTRL 0x6c
|
||||
#define REG_PHY_SET 0x75
|
||||
#define REG_PHY_CTRL 0x76
|
||||
#define REG_STA_ADDR0 0x78
|
||||
#define REG_STA_ADDR1 0x7a
|
||||
#define REG_STA_ADDR2 0x7c
|
||||
#define REG_MAX_FRAME 0x86
|
||||
|
||||
#define AC_LED_MODE 0x00004000
|
||||
#define AC_GB_RESET 0x00010000
|
||||
#define AC_RX_RESET 0x00020000
|
||||
#define AC_TX_RESET 0x00040000
|
||||
#define AC_DMA 0x00080000
|
||||
#define AC_FIFO 0x00100000
|
||||
#define AC_NETWORK 0x00200000
|
||||
#define AC_HOST 0x00400000
|
||||
#define AC_AUTO_INIT 0x00800000
|
||||
#define AC_RESET_BUSY 0x04000000
|
||||
#define AC_LED_SPEED 0x08000000
|
||||
#define AC_LED_MODE_B1 0x20000000
|
||||
#define AC_RESET_ALL (AC_GB_RESET | AC_RX_RESET | AC_TX_RESET | AC_DMA | \
|
||||
AC_FIFO | AC_NETWORK | AC_HOST | AC_AUTO_INIT)
|
||||
|
||||
#define MC_DUPLEX_SEL 0x00000020
|
||||
#define MC_TX_FC_ENA 0x00000080
|
||||
#define MC_RX_FC_ENA 0x00000100
|
||||
#define MC_STAT_DISABLE 0x00400000
|
||||
#define MC_TX_ENABLE 0x01000000
|
||||
#define MC_TX_DISABLE 0x02000000
|
||||
#define MC_RX_ENABLE 0x08000000
|
||||
#define MC_RX_DISABLE 0x10000000
|
||||
#define MC_PAUSED 0x40000000
|
||||
|
||||
#define PC_DUPLEX_STS 0x10
|
||||
#define PC_LINK_SPEED 0xc0
|
||||
#define PC_LINK_SPEED10 0x40
|
||||
#define PC_LINK_SPEED100 0x80
|
||||
#define PC_LINK_SPEED1000 0xc0
|
||||
|
||||
#define EC_READ 0x0200
|
||||
#define EC_BUSY 0x8000
|
||||
|
||||
static u16_t PhyParam[] = {
|
||||
(0x4000|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000,
|
||||
30, 0x005e, 9, 0x0700,
|
||||
(0x4100|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000,
|
||||
30, 0x005e, 9, 0x0700,
|
||||
(0x4200|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000,
|
||||
30, 0x005e, 9, 0x0700,
|
||||
(0x4300|(07*4)), 31, 0x0001, 27, 0x01e0, 31, 0x0002, 27, 0xeb8e, 31, 0x0000,
|
||||
30, 0x005e, 9, 0x0700, 0x0000
|
||||
};
|
||||
|
||||
/* ======= Data Descriptor ======= */
|
||||
typedef struct ic_desc {
|
||||
u64_t next;;
|
||||
u64_t status;;
|
||||
u64_t frag_info;;
|
||||
} ic_desc;
|
||||
|
||||
/* Driver Data Structure */
|
||||
typedef struct ic_driver {
|
||||
u32_t base_addr; /* Base address */
|
||||
int revision; /* Revision ID */
|
||||
int irq; /* IRQ number */
|
||||
int mode;
|
||||
int link; /* Whether link-up */
|
||||
int recv_flag; /* Receive flag */
|
||||
int send_flag; /* Send flag */
|
||||
int tx_busy;
|
||||
|
||||
/* Buffer */
|
||||
size_t buf_size;
|
||||
char *buf;
|
||||
|
||||
/* Rx data */
|
||||
int rx_head;
|
||||
struct {
|
||||
phys_bytes buf_dma;
|
||||
char *buf;
|
||||
} rx[RX_DESC_NUM];
|
||||
ic_desc *rx_desc; /* Rx descriptor buffer */
|
||||
phys_bytes rx_desc_dma; /* Rx descriptor DMA buffer */
|
||||
|
||||
/* Tx data */
|
||||
int tx_head;
|
||||
int tx_tail;
|
||||
struct {
|
||||
int busy;
|
||||
phys_bytes buf_dma;
|
||||
char *buf;
|
||||
} tx[TX_DESC_NUM];
|
||||
ic_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];
|
||||
} ic_driver;
|
||||
|
||||
#endif
|
@ -66,6 +66,7 @@ service_get_policies(struct policies * pol, index_t slot)
|
||||
{ .label = "dpeth", .policy_str = "reset" },
|
||||
{ .label = "e1000", .policy_str = "reset" },
|
||||
{ .label = "fxp", .policy_str = "reset" },
|
||||
{ .label = "ip1000", .policy_str = "reset" },
|
||||
{ .label = "lance", .policy_str = "reset" },
|
||||
{ .label = "lan8710a", .policy_str = "reset" },
|
||||
{ .label = "orinoco", .policy_str = "reset" },
|
||||
|
Loading…
x
Reference in New Issue
Block a user