kern/51333: Pass missing CIS data into OLDCARD PCMCIA drivers

M. Warner Losh imp at bsdimp.com
Wed Apr 23 16:20:06 PDT 2003


The following reply was made to PR kern/51333; it has been noted by GNATS.

From: "M. Warner Losh" <imp at bsdimp.com>
To: freebsd-gnats-submit at FreeBSD.org
Cc: scott+freebsd at fishballoon.org
Subject: Re: kern/51333: Pass missing CIS data into OLDCARD PCMCIA drivers
Date: Wed, 23 Apr 2003 17:14:39 -0600 (MDT)

 Well done on a patch that can almost be committed to the tree as is.
 However, there's one minor problem with it.  Specifically, I've been
 trying to maintain binary compatibility for the ioctls listed in the
 cardinfo.h file.  This patch changes the size of dev_desc, which
 breaks PIOSDRV.  However, the attached patch should correct that
 issue.
 
 Comments?
 
 
 ==== //depot/user/imp/newcard/pccard/cardinfo.h#4 - /dell/imp/p4/newcard/src/sys/pccard/cardinfo.h ====
 @@ -43,6 +43,7 @@
  #define	PIOCSMEM	_IOW('P', 3, struct mem_desc)	/* Set memory map */
  #define	PIOCGIO		_IOWR('P', 4, struct io_desc)	/* Get I/O map */
  #define	PIOCSIO		_IOW('P', 5, struct io_desc)	/* Set I/O map */
 +#define PIOCSDRVOLD	_IOWR('P', 6, struct dev_desc_old) /* Set driver */
  #define PIOCSDRV	_IOWR('P', 6, struct dev_desc)	/* Set driver */
  #define PIOCRWFLAG	_IOW('P', 7, int)	/* Set flags for drv use */
  #define PIOCRWMEM	_IOWR('P', 8, unsigned long) /* Set mem for drv use */
 @@ -153,6 +154,22 @@
  	uint32_t	product;	/* Product ID */
  	uint32_t	prodext;	/* Product ID (extended) */
  };
 +struct dev_desc_old {
 +	char		name[16];	/* Driver name */
 +	int		unit;		/* Driver unit number */
 +	unsigned long	mem;		/* Memory address of driver */
 +	int		memsize;	/* Memory size (if used) */
 +	int		iobase;		/* base of I/O ports */
 +	int		iosize;		/* Length of I/O ports */
 +	int		irqmask;	/* Interrupt number(s) to allocate */
 +	int		flags;		/* Device flags */
 +	uint8_t		misc[DEV_MISC_LEN]; /* For any random info */
 +	uint8_t		manufstr[DEV_MAX_CIS_LEN];
 +	uint8_t		versstr[DEV_MAX_CIS_LEN];
 +	uint32_t	manufacturer;	/* Manufacturer ID */
 +	uint32_t	product;	/* Product ID */
 +	uint32_t	prodext;	/* Product ID (extended) */
 +};
  #define DEV_DESC_HAS_SIZE 1
  
  struct pcic_reg {
 ==== //depot/user/imp/newcard/pccard/pccard.c#12 - /dell/imp/p4/newcard/src/sys/pccard/pccard.c ====
 @@ -478,6 +478,10 @@
  	int		pwval;
  	int		s;
  	struct slot	*slt = PCCARD_DEV2SOFTC(dev);
 +#if __FreeBSD_version < 5000000		/* 4.x compatibility only. */
 +	struct dev_desc d;
 +	struct dev_desc_old *odp;
 +#endif
  
  	if (slt == 0 && cmd != PIOCRWMEM)
  		return (ENXIO);
 @@ -608,6 +612,34 @@
  		else
  			pccard_failure_beep();
  		return (err);
 +#if __FreeBSD_version < 5000000		/* 4.x compatibility only. */
 +	case PIOCSDRVOLD:
 +		if (suser(td))
 +			return (EPERM);
 +		odp = (struct dev_desc_old *) data;
 +		strlcpy(d.name, odp->name, sizeof(d.name));
 +		d.unit = odp->unit;
 +		d.mem = odp->mem;
 +		d.memsize = odp->memsize;
 +		d.iobase = odp->iobase;
 +		d.iosize = odp->iosize;
 +		d.irqmask = odp->irqmask;
 +		d.flags = odp->flags;
 +		memcpy(d.misc, odp->misc, sizeof(odp->misc));
 +		strlcpy(d.manufstr, odp->manufstr, sizeof(d.manufstr));
 +		strlcpy(d.versstr, odp->versstr, sizeof(d.versstr));
 +		*d.cis3str = '\0';
 +		*d.cis4str = '\0';
 +		d.manufacturer = odp->manufacturer;
 +		d.product = odp->product;
 +		d.prodext = odp->prodext;
 +		err = allocate_driver(slt, &d);
 +		if (!err)
 +			pccard_success_beep();
 +		else
 +			pccard_failure_beep();
 +		return (err);
 +#endif
  	/*
  	 * Virtual removal/insertion
  	 */


More information about the freebsd-bugs mailing list