btdev错误码整改,编码格式调整

Signed-off-by: yangyanjun <yangyanjun@huawei.com>
This commit is contained in:
yangyanjun
2023-03-15 11:46:33 +08:00
parent 76b602810a
commit ed0585b035
3 changed files with 120 additions and 141 deletions
+2
View File
@@ -1 +1,3 @@
# enable btdev:
# kernel/linux/linux-5.10/drivers/net/Makefile add obj-y += bt/
obj-y += btdev.o
+114 -141
View File
@@ -11,7 +11,7 @@ static int bt_seq_show(struct seq_file *m, void *v)
{
struct bt_virnet *vnet = NULL;
pr_devel("bt seq_show\n");
pr_devel("bt seq_show");
seq_printf(m, "Total device: %d (bitmap: 0x%X) Ring size: %d\n",
bt_get_total_device(bt_drv), bt_drv->bitmap,
BT_RING_BUFFER_SIZE);
@@ -25,12 +25,12 @@ static int bt_seq_show(struct seq_file *m, void *v)
bt_virnet_get_ring_packets(vnet));
}
return 0;
return OK;
}
static int bt_proc_open(struct inode *inode, struct file *file)
{
pr_devel("bt proc_open\n");
pr_devel("bt proc_open");
return single_open(file, bt_seq_show, PDE_DATA(inode));
}
@@ -43,17 +43,19 @@ static struct proc_ops bt_proc_fops = {
static int bt_io_file_open(struct inode *node, struct file *filp)
{
struct bt_virnet *vnet = NULL;
int ret = 0;
int ret = OK;
pr_devel("bt io file open called...\n");
pr_devel("bt io file open called");
list_for_each_entry(vnet, &bt_drv->devices_table->head, virnet_entry) {
if (bt_virnet_get_cdev(vnet) == node->i_cdev) {
struct net_device *ndev;
if ((filp->f_flags & O_ACCMODE) == O_RDONLY) {
if (unlikely(!atomic_dec_and_test(&vnet->io_file
->read_open_limit))) {
atomic_inc(&vnet->io_file->read_open_limit);
pr_err("file %s has been opened for read twice already\n",
pr_err("file %s has been opened for read twice already",
bt_virnet_get_cdev_name(vnet));
return -EBUSY;
}
@@ -61,7 +63,7 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
if (unlikely(!atomic_dec_and_test(&vnet->io_file
->write_open_limit))) {
atomic_inc(&vnet->io_file->write_open_limit);
pr_err("file %s has been opened for write twice already\n",
pr_err("file %s has been opened for write twice already",
bt_virnet_get_cdev_name(vnet));
return -EBUSY;
}
@@ -69,7 +71,7 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
if (unlikely(!atomic_dec_and_test(&vnet->io_file
->read_open_limit))) {
atomic_inc(&vnet->io_file->read_open_limit);
pr_err("file %s has been opened for read twice already\n",
pr_err("file %s has been opened for read twice already",
bt_virnet_get_cdev_name(vnet));
return -EBUSY;
}
@@ -77,19 +79,19 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
if (unlikely(!atomic_dec_and_test(&vnet->io_file
->write_open_limit))) {
atomic_inc(&vnet->io_file->write_open_limit);
pr_err("file %s has been opened for write twice already\n",
pr_err("file %s has been opened for write twice already",
bt_virnet_get_cdev_name(vnet));
return -EBUSY;
}
}
rtnl_lock();
if (unlikely(!(vnet->ndev->flags & IFF_UP))) {
ret = dev_change_flags(vnet->ndev, vnet->ndev
->flags | IFF_UP, NULL);
ndev = vnet->ndev;
if (unlikely(!(ndev->flags & IFF_UP))) {
ret = dev_change_flags(ndev, ndev->flags | IFF_UP, NULL);
if (unlikely(ret < 0)) {
rtnl_unlock();
pr_err("bt dev_change_flags error: ret=%d\n", ret);
pr_err("bt dev_change_flags error: ret=%d", ret);
return -EBUSY;
}
}
@@ -97,18 +99,18 @@ static int bt_io_file_open(struct inode *node, struct file *filp)
SET_STATE(vnet, BT_VIRNET_STATE_CONNECTED);
filp->private_data = vnet;
return 0;
return OK;
}
}
return -EFAULT;
return -EIO;
}
static int bt_io_file_release(struct inode *node, struct file *filp)
{
struct bt_virnet *vnet = filp->private_data;
pr_devel("bt io file release called...\n");
pr_devel("bt io file release called");
if ((filp->f_flags & O_ACCMODE) == O_RDONLY) {
atomic_inc(&vnet->io_file->read_open_limit);
@@ -121,7 +123,7 @@ static int bt_io_file_release(struct inode *node, struct file *filp)
SET_STATE(vnet, BT_VIRNET_STATE_DISCONNECTED);
return 0;
return OK;
}
static ssize_t bt_io_file_read(struct file *filp,
@@ -132,7 +134,7 @@ static ssize_t bt_io_file_read(struct file *filp,
ssize_t out_sz;
struct sk_buff *skb = NULL;
pr_devel("bt io file read called...\n");
pr_devel("bt io file read called");
while (unlikely(bt_ring_is_empty(vnet->tx_ring))) {
if (filp->f_flags & O_NONBLOCK)
@@ -144,24 +146,24 @@ static ssize_t bt_io_file_read(struct file *filp,
}
skb = bt_ring_current(vnet->tx_ring);
out_sz = skb->len - 2 * ETH_ALEN;
out_sz = skb->len - MACADDR_LEN;
if (unlikely(out_sz > size)) {
pr_err("io file read: buffer too small: skb's len=%ld buffer's len=%ld\n",
pr_err("io file read: buffer too small: skb's len=%ld buffer's len=%ld",
(long)out_sz, (long)size);
return -EINVAL;
}
bt_ring_consume(vnet->tx_ring);
if (copy_to_user(buffer, skb->data + 2 * ETH_ALEN, out_sz)) {
pr_err("io file read: copy_to_user failed\n");
return -EFAULT;
if (copy_to_user(buffer, skb->data + MACADDR_LEN, out_sz)) {
pr_err("io file read: copy_to_user failed");
return -EIO;
}
dev_kfree_skb(skb);
skb = NULL;
if (unlikely(netif_queue_stopped(vnet->ndev))) {
pr_info("consume data: wake the queue\n");
pr_devel("consume data: wake the queue");
netif_wake_queue(vnet->ndev);
}
@@ -178,11 +180,8 @@ static ssize_t bt_io_file_write(struct file *filp,
int len;
ssize_t in_sz;
pr_devel("bt io file write called...\n");
pr_info("bt io file write called: %lu bytes\n", size);
in_sz = size + 2 * ETH_ALEN;
pr_devel("bt io file write called: %lu bytes", size);
in_sz = size + MACADDR_LEN;
skb = netdev_alloc_skb(bt_virnet_get_ndev(vnet), in_sz + 2);
if (unlikely(!skb))
@@ -191,9 +190,9 @@ static ssize_t bt_io_file_write(struct file *filp,
skb_reserve(skb, 2);
skb_put(skb, in_sz);
memset(skb->data, 0, 2 * ETH_ALEN);
if (copy_from_user(skb->data + 2 * ETH_ALEN, buffer, size))
return -EFAULT;
memset(skb->data, 0, MACADDR_LEN);
if (copy_from_user(skb->data + MACADDR_LEN, buffer, size))
return -EIO;
len = skb->len;
skb->dev = bt_virnet_get_ndev(vnet);
@@ -213,16 +212,16 @@ static ssize_t bt_io_file_write(struct file *filp,
static int bt_virnet_change_mtu(struct net_device *dev, int mtu)
{
pr_devel("bt virnet change mtu called...\n");
pr_devel("bt virnet change mtu called");
dev->mtu = mtu;
return 0;
return OK;
}
static int bt_set_mtu(struct net_device *dev, int mtu)
{
int err = 0;
int err = OK;
pr_info("bt set_mtu called...\n");
pr_devel("bt set_mtu called");
rtnl_lock();
err = dev_set_mtu(dev, mtu);
if (err < 0)
@@ -240,21 +239,21 @@ static int bt_cmd_enable_virnet(struct bt_virnet *vnet, unsigned long arg)
WARN_ON(!vnet);
if (unlikely(vnet->state != BT_VIRNET_STATE_DISABLED)) {
pr_err("bt enable can only be set at DISABLED state\n");
return -1; // enable failed
pr_err("bt enable can only be set at DISABLED state");
return -EINVAL; // enable failed
}
rtnl_lock();
ret = dev_change_flags(vnet->ndev, vnet->ndev->flags | IFF_UP, NULL);
if (unlikely(ret < 0)) {
rtnl_unlock();
pr_err("bt cmd enable virnet: dev_change_flags error: ret=%d\n", ret);
return -2;
pr_err("bt cmd enable virnet: dev_change_flags error: ret=%d", ret);
return -EIO;
}
rtnl_unlock();
SET_STATE(vnet, BT_VIRNET_STATE_CONNECTED);
return 0;
return OK;
}
static int bt_cmd_disable_virnet(struct bt_virnet *vnet, unsigned long arg)
@@ -263,21 +262,21 @@ static int bt_cmd_disable_virnet(struct bt_virnet *vnet, unsigned long arg)
WARN_ON(!vnet);
if (unlikely(vnet->state != BT_VIRNET_STATE_CONNECTED)) {
pr_err("bt disable can only be set at CONNECTED state\n");
return -1;
pr_err("bt disable can only be set at CONNECTED state");
return -EINVAL;
}
rtnl_lock();
ret = dev_change_flags(vnet->ndev, vnet->ndev->flags & ~IFF_UP, NULL);
if (unlikely(ret < 0)) {
rtnl_unlock();
pr_err("bt cmd disable virnet: dev_change_flags error: ret=%d\n", ret);
return -2;
pr_err("bt cmd disable virnet: dev_change_flags error: ret=%d", ret);
return -EIO;
}
rtnl_unlock();
SET_STATE(vnet, BT_VIRNET_STATE_DISABLED);
return 0;
return OK;
}
static int bt_cmd_change_mtu(struct bt_virnet *vnet, unsigned long arg)
@@ -288,37 +287,37 @@ static int bt_cmd_change_mtu(struct bt_virnet *vnet, unsigned long arg)
WARN_ON(!vnet);
if (unlikely(get_user(mtu, (int __user *)arg))) {
pr_err("get_user failed!!\n");
return -1;
pr_err("get_user failed");
return -EIO;
}
ret = bt_set_mtu(vnet->ndev, mtu);
if (unlikely(ret < 0)) {
pr_err("bt_dev_ioctl: changed mtu failed\n");
return -1;
pr_err("bt_dev_ioctl: changed mtu failed");
return -EIO;
}
return 0;
return OK;
}
static int bt_cmd_peek_packet(struct bt_virnet *vnet, unsigned long arg)
{
struct sk_buff *skb = NULL;
pr_devel("bt peek packet called...\n");
pr_devel("bt peek packet called");
if (unlikely(bt_ring_is_empty(vnet->tx_ring))) {
pr_err("bt peek packet ring is empty...\n");
pr_err("bt peek packet ring is empty");
return -EAGAIN;
}
skb = bt_ring_current(vnet->tx_ring);
if (unlikely(put_user(skb->len - 2 * ETH_ALEN, (int __user *)arg))) {
pr_err("put_user failed!!\n");
return -1;
if (unlikely(put_user(skb->len - MACADDR_LEN, (int __user *)arg))) {
pr_err("put_user failed");
return -EIO;
}
return 0;
return OK;
}
static long bt_io_file_ioctl(struct file *filep,
@@ -329,33 +328,23 @@ static long bt_io_file_ioctl(struct file *filep,
struct bt_virnet *vnet = filep->private_data;
pr_devel("bt io file ioctl called...\n");
pr_devel("bt io file ioctl called");
switch (cmd) {
case BT_IOC_CHANGE_MTU:
{
ret = bt_cmd_change_mtu(vnet, arg);
break;
}
case BT_IOC_ENABLE:
{
ret = bt_cmd_enable_virnet(vnet, arg);
break;
}
case BT_IOC_DISABLE:
{
ret = bt_cmd_disable_virnet(vnet, arg);
break;
}
case BT_IOC_PEEK_PACKET:
{
ret = bt_cmd_peek_packet(vnet, arg);
break;
}
default:
{
pr_err("not a valid cmd\n");
return -1;
}
pr_err("not a valid cmd");
return -ENOIOCTLCMD;
}
return ret;
@@ -390,26 +379,26 @@ static const struct file_operations bt_io_file_ops = {
static int bt_mng_file_open(struct inode *node, struct file *filp)
{
pr_devel("bt mng file open called...\n");
pr_devel("bt mng file open called");
if (unlikely(!atomic_dec_and_test(&bt_drv->mng_file->open_limit))) {
atomic_inc(&bt_drv->mng_file->open_limit);
pr_err("file %s has been opened already\n",
pr_err("file %s has been opened already",
bt_drv->mng_file->bt_cdev->dev_filename);
return -EBUSY;
}
filp->private_data = bt_drv;
return 0;
return OK;
}
static int bt_mng_file_release(struct inode *node, struct file *filp)
{
struct bt_drv *bt_drv = filp->private_data;
pr_devel("bt mng file release called...\n");
pr_devel("bt mng file release called");
atomic_inc(&bt_drv->mng_file->open_limit);
return 0;
return OK;
}
static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
@@ -424,18 +413,18 @@ static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
mutex_lock(&bt_mng->bitmap_lock);
id = bt_get_unused_id(&bt_mng->bitmap);
pr_info("create io_file: get unused bit: %d\n", id);
pr_devel("create io_file: get unused bit: %d", id);
if (unlikely(bt_mng->devices_table->num == BT_VIRNET_MAX_NUM)) {
pr_err("reach the limit of max virnets\n");
pr_err("reach the limit of max virnets");
mutex_unlock(&bt_mng->bitmap_lock);
return -1;
return -EIO;
}
vnet = bt_virnet_create(bt_mng, id);
if (unlikely(!vnet)) {
pr_err("bt virnet create failed\n");
pr_err("bt virnet create failed");
mutex_unlock(&bt_mng->bitmap_lock);
return -1;
return -EIO;
}
vnet->bt_table_head = bt_mng->devices_table;
@@ -444,7 +433,7 @@ static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
pr_err("bt table add device failed: ret=%d", ret);
bt_virnet_destroy(vnet);
mutex_unlock(&bt_mng->bitmap_lock);
return -1; // failed to create
return -EIO; // failed to create
}
bt_set_bit(&bt_mng->bitmap, id);
@@ -455,14 +444,14 @@ static int bt_cmd_create_virnet(struct bt_drv *bt_mng, unsigned long arg)
memcpy(vp.cfile_name, bt_virnet_get_cdev_name(vnet),
sizeof(vp.cfile_name));
mdelay(100);
mdelay(DELAY_100_MS);
size = copy_to_user((void __user *)arg, &vp, sizeof(struct bt_uioc_args));
if (unlikely(size)) {
pr_err("copy_to_user failed: left size=%lu", size);
return -1;
return -EIO;
}
return 0;
return OK;
}
static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
@@ -478,13 +467,13 @@ static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
sizeof(struct bt_uioc_args));
if (unlikely(size)) {
pr_err("copy_from_user failed: left size=%lu", size);
return -1;
return -EIO;
}
vnet = bt_table_find(bt_mng->devices_table, vp.ifa_name);
if (unlikely(!vnet)) {
pr_err("virnet: %s cannot be found in bt table", vp.ifa_name);
return -2; // not found
return -EIO; // not found
}
mutex_lock(&bt_mng->bitmap_lock);
@@ -493,24 +482,24 @@ static int bt_cmd_delete_virnet(struct bt_drv *bt_mng, unsigned long arg)
bt_virnet_destroy(vnet);
bt_clear_bit(&bt_mng->bitmap, id);
mutex_unlock(&bt_mng->bitmap_lock);
return 0;
return OK;
}
static int bt_cmd_query_all_virnets(struct bt_drv *bt_mng, unsigned long arg)
{
WARN_ON(!bt_mng);
if (unlikely(put_user(bt_mng->bitmap, (u32 *)arg))) {
pr_err("put_user failed!!\n");
return -1;
pr_err("put_user failed");
return -EIO;
}
return 0;
return OK;
}
static int bt_cmd_delete_all_virnets(struct bt_drv *bt_mng, unsigned long arg)
{
WARN_ON(!bt_mng);
bt_table_delete_all(bt_mng);
return 0;
return OK;
}
static long bt_mng_file_ioctl(struct file *filep,
@@ -521,37 +510,23 @@ static long bt_mng_file_ioctl(struct file *filep,
struct bt_drv *bt_mng = filep->private_data;
pr_devel("bt mng file ioctl called...\n");
pr_devel("bt mng file ioctl called");
switch (cmd) {
case BT_IOC_CREATE:
{
ret = bt_cmd_create_virnet(bt_mng, arg);
break;
}
case BT_IOC_DELETE:
{
ret = bt_cmd_delete_virnet(bt_mng, arg);
break;
}
case BT_IOC_QUERY_ALL:
{
ret = bt_cmd_query_all_virnets(bt_mng, arg);
break;
}
case BT_IOC_DELETE_ALL:
{
ret = bt_cmd_delete_all_virnets(bt_mng, arg);
break;
}
default:
{
pr_err("not a valid command\n");
return -1;
}
pr_err("not a valid command");
return -ENOIOCTLCMD;
}
return ret;
}
@@ -570,16 +545,14 @@ static netdev_tx_t bt_virnet_xmit(struct sk_buff *skb,
struct bt_virnet *vnet = NULL;
int len = skb->len;
pr_alert("alert: bt virnet_xmit: called...\n");
pr_alert("alert: bt virnet_xmit: called");
vnet = bt_table_find(bt_drv->devices_table, dev->name);
WARN_ON(!vnet);
ret = bt_virnet_produce_data(vnet, (void *)skb);
if (unlikely(ret < 0)) {
pr_info("virnet xmit: produce data failed: ring is full\n"
"need to stop queue\n");
pr_devel("virnet xmit: produce data failed: ring is full, need to stop queue");
netif_stop_queue(vnet->ndev);
return NETDEV_TX_BUSY;
}
@@ -619,7 +592,7 @@ static int bt_table_add_device(struct bt_table *tbl, struct bt_virnet *vn)
vnet = bt_table_find(tbl, bt_virnet_get_ndev_name(vn));
if (unlikely(vnet)) {
pr_err("found duplicated device");
return -1; // duplicated
return -ENOIOCTLCMD; // duplicated
}
mutex_lock(&tbl->tbl_lock);
@@ -627,7 +600,7 @@ static int bt_table_add_device(struct bt_table *tbl, struct bt_virnet *vn)
++tbl->num;
mutex_unlock(&tbl->tbl_lock);
return 0;
return OK;
}
static void bt_table_remove_device(struct bt_table *tbl, struct bt_virnet *vn)
@@ -699,7 +672,7 @@ static struct bt_ring *__bt_ring_create(int size)
struct bt_ring *ring = kmalloc(sizeof(*ring), GFP_KERNEL);
if (unlikely(!ring)) {
pr_err("ring create alloc failed: oom\n");
pr_err("ring create alloc failed: oom");
return NULL;
}
@@ -710,7 +683,7 @@ static struct bt_ring *__bt_ring_create(int size)
ring->tail = 0;
ring->data = kmalloc_array(size, sizeof(void *), GFP_KERNEL);
if (unlikely(!ring->data)) {
pr_err("ring create alloc data failed: oom\n");
pr_err("ring create alloc data failed: oom");
kfree(ring);
return NULL;
}
@@ -777,8 +750,8 @@ static int bt_virnet_produce_data(struct bt_virnet *dev, void *data)
WARN_ON(!dev);
WARN_ON(!data);
if (unlikely(bt_ring_is_full(dev->tx_ring))) {
pr_info("ring is full");
return -1;
pr_devel("ring is full");
return -ENFILE;
}
smp_wmb(); // Make sure the write order is correct
@@ -786,7 +759,7 @@ static int bt_virnet_produce_data(struct bt_virnet *dev, void *data)
smp_wmb(); // Make sure twrite order is correct
wake_up(&dev->rx_queue);
return 0;
return OK;
}
/**
@@ -824,17 +797,17 @@ static int bt_cdev_device_create(struct bt_cdev *dev,
WARN_ON(!dev);
WARN_ON(!cls);
pr_devel("bt cdev_device_create: id=%d\n", id);
pr_devel("bt cdev_device_create: id=%d", id);
dev->bt_class = cls;
device = device_create(cls, NULL, devno, NULL, "%s%u", BT_DEV_NAME_PREFIX, id);
if (IS_ERR(device)) {
pr_err("create device failed");
return -1;
return -EIO;
}
snprintf(dev->dev_filename, sizeof(dev->dev_filename), "%s%u", BT_DEV_PATH_PREFIX, id);
return 0;
return OK;
}
static void bt_cdev_device_destroy(struct bt_cdev *dev)
@@ -853,17 +826,17 @@ static struct bt_cdev *bt_cdev_create(const struct file_operations *ops,
WARN_ON(!ops);
pr_devel("bt cdev create called...\n");
pr_devel("bt cdev create called");
dev = kmalloc(sizeof(*dev), GFP_KERNEL);
if (unlikely(!dev)) {
pr_err("bt cdev_create alloc failed: oom\n");
pr_err("bt cdev_create alloc failed: oom");
goto err1;
}
chrdev = cdev_alloc();
if (unlikely(!chrdev)) {
pr_err("bt cdev_create: cdev_alloc() failed: oom\n");
pr_err("bt cdev_create: cdev_alloc() failed: oom");
goto err2;
}
@@ -872,12 +845,12 @@ static struct bt_cdev *bt_cdev_create(const struct file_operations *ops,
ret = cdev_add(chrdev, MKDEV(BT_DEV_MAJOR, minor), 1);
if (unlikely(ret < 0)) {
pr_err("cdev add failed\n");
pr_err("cdev add failed");
goto err3;
}
if (unlikely(bt_cdev_device_create(dev, bt_drv->bt_class, minor) < 0)) {
pr_err("bt cdev_device_create failed\n");
pr_err("bt cdev_device_create failed");
goto err3;
}
return dev;
@@ -921,12 +894,12 @@ static struct bt_io_file *bt_create_io_file(u32 id)
struct bt_io_file *file = kmalloc(sizeof(*file), GFP_KERNEL);
if (unlikely(!file)) {
pr_err("bt create_io_file alloc failed: oom\n");
pr_err("bt create_io_file alloc failed: oom");
return NULL;
}
file->bt_cdev = bt_cdev_create(&bt_io_file_ops, id);
if (unlikely(!file->bt_cdev)) {
pr_err("bt create_io_file: create cdev failed\n");
pr_err("bt create_io_file: create cdev failed");
kfree(file);
return NULL;
}
@@ -937,12 +910,12 @@ static struct bt_io_file *bt_create_io_file(u32 id)
static struct bt_io_file **bt_create_io_files(void)
{
int i = 0;
int i;
struct bt_io_file **all_files = kmalloc(BT_VIRNET_MAX_NUM * sizeof(struct bt_io_file *),
GFP_KERNEL);
GFP_KERNEL);
if (unlikely(!all_files)) {
pr_err("bt create_io_files alloc failed: oom\n");
pr_err("bt create_io_files alloc failed: oom");
return NULL;
}
for (i = 0; i < BT_VIRNET_MAX_NUM; ++i)
@@ -979,13 +952,13 @@ static struct bt_mng_file *bt_create_mng_file(int id)
struct bt_mng_file *file = kmalloc(sizeof(*file), GFP_KERNEL);
if (unlikely(!file)) {
pr_err("bt create_mng_file: oom\n");
pr_err("bt create_mng_file: oom");
return NULL;
}
file->bt_cdev = bt_cdev_create(&bt_mng_file_ops, id);
if (unlikely(!file->bt_cdev)) {
pr_err("bt create_mng_file: create cdev failed\n");
pr_err("bt create_mng_file: create cdev failed");
kfree(file);
return NULL;
}
@@ -1024,7 +997,7 @@ static struct net_device *bt_net_device_create(u32 id)
snprintf(ifa_name, sizeof(ifa_name), "%s%d", BT_VIRNET_NAME_PREFIX, id);
ndev = alloc_netdev(0, ifa_name, NET_NAME_UNKNOWN, ether_setup);
if (unlikely(!ndev)) {
pr_err("alloc_netdev failed\n");
pr_err("alloc_netdev failed");
return NULL;
}
@@ -1069,7 +1042,7 @@ static struct bt_virnet *bt_virnet_create(struct bt_drv *bt_mng, u32 id)
struct bt_virnet *vnet = kmalloc(sizeof(*vnet), GFP_KERNEL);
if (unlikely(!vnet)) {
pr_err("error: bt_virnet init failed\n");
pr_err("error: bt_virnet init failed");
goto failure1;
}
@@ -1142,7 +1115,7 @@ static int __init bt_module_init(void)
int mid;
struct proc_dir_entry *entry = NULL;
pr_devel("bt module_init called...\n");
pr_devel("bt module_init called");
bt_drv = kmalloc(sizeof(*bt_drv), GFP_KERNEL);
if (unlikely(!bt_drv)) {
pr_err("module init: alloc struct bt_drv failed: oom");
@@ -1173,11 +1146,11 @@ static int __init bt_module_init(void)
mutex_lock(&bt_drv->bitmap_lock);
mid = bt_get_unused_id(&bt_drv->bitmap);
pr_info("create mng_file: get unused bit: %d\n", mid);
pr_devel("create mng_file: get unused bit: %d", mid);
bt_drv->mng_file = bt_create_mng_file(mid);
if (unlikely(!bt_drv->mng_file)) {
pr_err("bt_ctrl_cdev_init(): failed");
pr_err("bt_ctrl_cdev_init failed");
mutex_unlock(&bt_drv->bitmap_lock);
goto failure4;
}
@@ -1190,7 +1163,7 @@ static int __init bt_module_init(void)
goto failure5;
}
return 0;
return OK;
failure5:
bt_delete_mng_file(bt_drv->mng_file);
@@ -1210,4 +1183,4 @@ failure1:
module_init(bt_module_init);
module_exit(bt_module_release);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_LICENSE("GPL");
+4
View File
@@ -36,6 +36,10 @@
/* must include btdev_user.h first before any macro definition */
#include "btdev_user.h"
#define OK 0
#define DELAY_100_MS 100
#define MACADDR_LEN (2 * ETH_ALEN)
#define BT_DEV_MAJOR 125
#define BT_DEV_MINOR 0
#define BT_RING_BUFFER_SIZE 4096