⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtl8139.c

📁 newos is new operation system
💻 C
字号:
/*** Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.** Distributed under the terms of the NewOS License.*/#include <kernel/kernel.h>#include <boot/stage2.h>#include <kernel/debug.h>#include <kernel/heap.h>#include <kernel/fs/devfs.h>#include <string.h>#include <newos/errors.h>#include <kernel/net/ethernet.h>#include "rtl8139_priv.h"static int rtl8139_open(dev_ident ident, dev_cookie *cookie){	rtl8139 *rtl = (rtl8139 *)ident;	*cookie = rtl;	return 0;}static int rtl8139_freecookie(dev_cookie cookie){	return 0;}static int rtl8139_seek(dev_cookie cookie, off_t pos, seek_type st){	return ERR_NOT_ALLOWED;}static int rtl8139_close(dev_cookie cookie){	return 0;}static ssize_t rtl8139_read(dev_cookie cookie, void *buf, off_t pos, ssize_t len){	rtl8139 *rtl = (rtl8139 *)cookie;	if(len < ETHERNET_MAX_SIZE)		return ERR_VFS_INSUFFICIENT_BUF;	return rtl8139_rx(rtl, buf, len);}static ssize_t rtl8139_write(dev_cookie cookie, const void *buf, off_t pos, ssize_t len){	rtl8139 *rtl = (rtl8139 *)cookie;	if(len > ETHERNET_MAX_SIZE)		return ERR_VFS_INSUFFICIENT_BUF;	if(len < 0)		return ERR_INVALID_ARGS;	rtl8139_xmit(rtl, buf, len);	return len;}static int rtl8139_ioctl(dev_cookie cookie, int op, void *buf, size_t len){	rtl8139 *rtl = (rtl8139 *)cookie;	int err = NO_ERROR;	dprintf("rtl8139_ioctl: op %d, buf %p, len %Ld\n", op, buf, (long long)len);	if(!rtl)		return ERR_IO_ERROR;	switch(op) {		case IOCTL_NET_IF_GET_ADDR: // get the ethernet MAC address			if(len >= sizeof(rtl->mac_addr)) {				memcpy(buf, rtl->mac_addr, sizeof(rtl->mac_addr));			} else {				err = ERR_VFS_INSUFFICIENT_BUF;			}			break;		case IOCTL_NET_IF_GET_TYPE: // return the type of interface (ethernet, loopback, etc)			if(len >= sizeof(int)) {				*(int *)buf = IF_TYPE_ETHERNET;			} else {				err = ERR_VFS_INSUFFICIENT_BUF;			}			break;		default:			err = ERR_INVALID_ARGS;	}	return err;}static struct dev_calls rtl8139_hooks = {	&rtl8139_open,	&rtl8139_close,	&rtl8139_freecookie,	&rtl8139_seek,	&rtl8139_ioctl,	&rtl8139_read,	&rtl8139_write,	/* no paging here */	NULL,	NULL,	NULL};int dev_bootstrap(void);int dev_bootstrap(void){	rtl8139 *rtl;	dprintf("rtl8139_dev_init: entry\n");	// detect and setup the device	if(rtl8139_detect(&rtl) < 0) {		// no rtl8139 here		dprintf("rtl8139_dev_init: no device found\n");		return ERR_GENERAL;	}	rtl8139_init(rtl);	// create device node	devfs_publish_indexed_device("net/rtl8139", rtl, &rtl8139_hooks);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -