//----------------------------------------------------------------------------
// 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;
}
Esempio n. 2
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;
}