Device driver: wsio_get_isc() returns NULL

  • Follow


Hello.  I'm writing a monolithic DKLM and I'm finding that wsio_get_isc()
always seems to return a NULL 'isc' pointer even though the return code
indicates success.

For example, on the driver_ioctl() entry point:

mydriver_ioctl(dev_t dev, int flag)
{
   struct isc_table_type *isc;
   ...
   rc = wsio_get_isc(dev, &isc, &mydriver_wsio_info);
   if (rc != 1) {
       msg_printf("rc != 1\n");
       return EIO;
   }
   
   if (!isc) {
       printf("NULL!\n");
       return EIO;
   }
   ...
}


Now, section 10.8 of HP's DDK FAQ attempts to explain this problem:

"The device instance number is supposed to be encoded in bits 16-23
 (ie the third byte)...If the dev_t that is passed down has this encoding,
 wsio_get_isc() will return a valid ISC pointer."


According to 'ioscan -fun', my device's instance number is 0:
unknown    0  10/6/3/0       mydrv CLAIMED     INTERFACE    PCI Co-Processor 

This agrees with the character special file I created in /dev:
crw-rw-rw-    1 root     sys      254,   0 Aug 18 21:17  my_device

Furthermore, it agrees with the dev_t that's being passed to my ioctl() 
routine: fe000000  (major 254, minor 0x000000).

(It is interesting that ioscan does not report /dev/my_device.  Is that
indicative of a problem?  If so, what?)

So...I don't understand.  The kernel is forming a dev_t value and passing it
to my ioctl() routine (or open(), or close()).  However when I attempt to use
WSIO to get an isc pointer from that dev_t value, the returned pointer 
is NULL.  The FAQ implies that this is because the dev_t value was somehow 
invalid.  

What am I not understanding here?

Any insights would be greatly appreciated.  Thanks.


Jimmie


(Sorry about the long-winded post.  I've wasted a day pursing this problem 
and I feel I'm no closer to the answer now than I was when I started.  As
an aside, I have to admit driver development for Solaris and in fact Linux 
is a lot less frustrating than it has been for HP-UX.  There's so little 
useful HP-UX information available that it seems HP is trying to discourage 
driver developers from targetting their platform).


0
Reply Jimmie 8/19/2005 1:45:00 AM

Jimmie Mayfield wrote:
> Hello.  I'm writing a monolithic DKLM and I'm finding that wsio_get_isc()
> always seems to return a NULL 'isc' pointer even though the return code
> indicates success.
> 
> For example, on the driver_ioctl() entry point:
> 
> mydriver_ioctl(dev_t dev, int flag)
> {
>    struct isc_table_type *isc;
>    ...
>    rc = wsio_get_isc(dev, &isc, &mydriver_wsio_info);
>    if (rc != 1) {
>        msg_printf("rc != 1\n");
>        return EIO;
>    }
>    
>    if (!isc) {
>        printf("NULL!\n");
>        return EIO;
>    }
>    ...
> }
> 
> 
> Now, section 10.8 of HP's DDK FAQ attempts to explain this problem:
> 
> "The device instance number is supposed to be encoded in bits 16-23
>  (ie the third byte)...If the dev_t that is passed down has this encoding,
>  wsio_get_isc() will return a valid ISC pointer."
> 
> 
> According to 'ioscan -fun', my device's instance number is 0:
> unknown    0  10/6/3/0       mydrv CLAIMED     INTERFACE    PCI Co-Processor 
> 
> This agrees with the character special file I created in /dev:
> crw-rw-rw-    1 root     sys      254,   0 Aug 18 21:17  my_device
> 
> Furthermore, it agrees with the dev_t that's being passed to my ioctl() 
> routine: fe000000  (major 254, minor 0x000000).
> 
> (It is interesting that ioscan does not report /dev/my_device.  Is that
> indicative of a problem?  If so, what?)
> 
> So...I don't understand.  The kernel is forming a dev_t value and passing it
> to my ioctl() routine (or open(), or close()).  However when I attempt to use
> WSIO to get an isc pointer from that dev_t value, the returned pointer 
> is NULL.  The FAQ implies that this is because the dev_t value was somehow 
> invalid.  
> 

1> Could you post your drv_info_t initialization here ?

2> Try calling wsio_get_isc(dev, &isc, NULL) with wsio.h included.
   This will work only if your driver is char driver.

--vishwas
0
Reply Pai 8/19/2005 5:28:01 AM


> That leads to another question though:
> 
> 1) What is the significance of the classname in the drv_info_t structure?
> 
>    The DLKM appeared to get initialized properly even with the bad
>    classname string.  That is, the attach() function was called, the 'isc'
>    was claimed and I was able to use that isc to read and write the 
>    card's register space.  No errors were reported by WSIO or any other
>    kernel routine.
> 
>    Problems didn't occur until I started to do things from user space.
>    The kernel called my driver routines (open, close, ioctl, etc) when the 
>    user space app accessed the corresponding /dev entry which suggests that 
>    the kernel has properly mapped the device major to my driver.  But the 
>    bad classname string somehow caused the kernel to fail to map the dev_t 
>    to the isc.  This still confuses me.
> 
>    It seems to me that if the classname were such an crucial piece
>    of information, WSIO should have thrown an error as soon as my driver
>    tried to claim the isc in the attach() routine.
> 

AFAIK class should be one of the known class strings or unknown.
Yes, WSIO should have reported an error if the class was not
acceptable.

--vishwas
0
Reply Pai 8/24/2005 4:45:24 AM

2 Replies
132 Views

(page loaded in 0.442 seconds)

Similiar Articles:













7/16/2012 1:02:47 PM


Reply: