//---------------------------------------------------------------------------- // AF_CAN netdevice: open device //---------------------------------------------------------------------------- static int pcan_netdev_open(struct net_device *dev) { struct can_priv *priv = netdev_priv(dev); struct pcandev *pdev = priv->pdev; DPRINTK(KERN_DEBUG "%s: %s %s\n", DEVICE_NAME, __FUNCTION__, dev->name); if (pcan_open_path(pdev)) return -ENODEV; netif_start_queue(dev); return 0; }
//---------------------------------------------------------------------------- // is called when the path is opened static int pcan_open(struct inode *inode, struct file *filep) { struct pcandev *dev; int err = 0; struct fileobj *fobj = (struct fileobj *)NULL; int _minor = minor(inode->i_rdev); int _major = MAJOR(inode->i_rdev); DPRINTK(KERN_DEBUG "%s: pcan_open(), major/minor = %d/%d.\n", DEVICE_NAME, _major, _minor); dev = pcan_search_dev(_major, _minor); if (!dev) return -ENODEV; // create file object fobj = kmalloc(sizeof(struct fileobj), GFP_KERNEL); if (!fobj) { DPRINTK(KERN_DEBUG "%s: can't allocate kernel memory!\n", DEVICE_NAME); return -ENOMEM; } // fill file object and init read and write method buffers fobj->dev = dev; if (filep->f_mode & FMODE_READ) { fobj->nReadRest = 0; fobj->nTotalReadCount = 0; fobj->pcReadPointer = fobj->pcReadBuffer; } if (filep->f_mode & FMODE_WRITE) { fobj->nWriteCount = 0; fobj->pcWritePointer = fobj->pcWriteBuffer; } filep->private_data = (void *)fobj; err = pcan_open_path(dev); if (err && fobj) /* oops */ kfree(fobj); return err; }