Вопрос

I am porting my linux driver to freebsd. I use "filp->private_data" variable to store some information required by driver. (To avoid locks in multi-threaded cases). I found BSD does not use "file" structure in linux and instead uses cdev. cdev does not have "private_data" variable. But I am sure there must be some other variable in BSD?

Does anyone know how to achieve what I am trying to do.

Thanks.

Это было полезно?

Решение

You have an instance of your softc structure for each instance of your device. That would usually have a mutex. You can use the si_drv1 member of the cdev to keep a pointer back to the softc. Something like:

struct mydev_softc {
    struct mtx m_lock;
    struct cdev* m_cdev;
    device_t m_dev;
    /* ... whatever else you need ... */
};

static int mydev_attach(device_t dev)
{
    struct mydev_softc* sc = device_get_softc(dev);

    mtx_init(&sc->m_lock);
    sc->m_cdev = make_dev(...);
    sc->m_cdev->si_drv1 = sc;
    sc->m_dev = dev;
    /* Plus whatever else you need */
 }

I have left out all the other driver initialisation stuff so you can see this part.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top