patch-2.3.17 linux/drivers/scsi/scsicam.c

Next file: linux/drivers/scsi/scsiiom.c
Previous file: linux/drivers/scsi/scsi_queue.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.16/linux/drivers/scsi/scsicam.c linux/drivers/scsi/scsicam.c
@@ -5,7 +5,7 @@
  *      Visionary Computing 
  *      (Unix and Linux consulting and custom programming)
  *      drew@Colorado.EDU
- *	+1 (303) 786-7975
+ *      +1 (303) 786-7975
  *
  * For more information, please consult the SCSI-CAM draft.
  */
@@ -23,59 +23,58 @@
 #include "sd.h"
 #include <scsi/scsicam.h>
 
-static int setsize(unsigned long capacity,unsigned int *cyls,unsigned int *hds,
-    unsigned int *secs);
+static int setsize(unsigned long capacity, unsigned int *cyls, unsigned int *hds,
+		   unsigned int *secs);
 
 /*
  * Function : int scsicam_bios_param (Disk *disk, int dev, int *ip)
  *
  * Purpose : to determine the BIOS mapping used for a drive in a 
- *	SCSI-CAM system, storing the results in ip as required
- *	by the HDIO_GETGEO ioctl().
+ *      SCSI-CAM system, storing the results in ip as required
+ *      by the HDIO_GETGEO ioctl().
  *
  * Returns : -1 on failure, 0 on success.
  *
  */
 
-int scsicam_bios_param (Disk *disk, /* SCSI disk */
-	kdev_t dev,		/* Device major, minor */
-    	int *ip			/* Heads, sectors, cylinders in that order */) {
-
-    struct buffer_head *bh;
-    int ret_code;
-    int size = disk->capacity;
-    unsigned long temp_cyl;
-
-    if (!(bh = bread(MKDEV(MAJOR(dev), MINOR(dev)&~0xf), 0, 1024)))
-	return -1;
-
-    /* try to infer mapping from partition table */
-    ret_code = scsi_partsize (bh, (unsigned long) size, (unsigned int *) ip + 2, 
-	(unsigned int *) ip + 0, (unsigned int *) ip + 1);
-    brelse (bh);
-
-    if (ret_code == -1) {
-	/* pick some standard mapping with at most 1024 cylinders,
-	   and at most 62 sectors per track - this works up to
-	   7905 MB */
-	ret_code = setsize ((unsigned long) size, (unsigned int *) ip + 2, 
-    	    (unsigned int *) ip + 0, (unsigned int *) ip + 1);
-    }
-
-    /* if something went wrong, then apparently we have to return
-       a geometry with more than 1024 cylinders */
-    if (ret_code || ip[0] > 255 || ip[1] > 63) {
-	 ip[0] = 64;
-	 ip[1] = 32;
-	 temp_cyl = size / (ip[0] * ip[1]);
-	 if (temp_cyl > 65534) {
-	      ip[0] = 255;
-	      ip[1] = 63;
-	 }
-	 ip[2] = size / (ip[0] * ip[1]);
-    }
-
-    return 0;
+int scsicam_bios_param(Disk * disk,	/* SCSI disk */
+		       kdev_t dev,	/* Device major, minor */
+		  int *ip /* Heads, sectors, cylinders in that order */ )
+{
+
+	struct buffer_head *bh;
+	int ret_code;
+	int size = disk->capacity;
+	unsigned long temp_cyl;
+
+	if (!(bh = bread(MKDEV(MAJOR(dev), MINOR(dev) & ~0xf), 0, 1024)))
+		return -1;
+
+	/* try to infer mapping from partition table */
+	ret_code = scsi_partsize(bh, (unsigned long) size, (unsigned int *) ip + 2,
+		       (unsigned int *) ip + 0, (unsigned int *) ip + 1);
+	brelse(bh);
+
+	if (ret_code == -1) {
+		/* pick some standard mapping with at most 1024 cylinders,
+		   and at most 62 sectors per track - this works up to
+		   7905 MB */
+		ret_code = setsize((unsigned long) size, (unsigned int *) ip + 2,
+		       (unsigned int *) ip + 0, (unsigned int *) ip + 1);
+	}
+	/* if something went wrong, then apparently we have to return
+	   a geometry with more than 1024 cylinders */
+	if (ret_code || ip[0] > 255 || ip[1] > 63) {
+		ip[0] = 64;
+		ip[1] = 32;
+		temp_cyl = size / (ip[0] * ip[1]);
+		if (temp_cyl > 65534) {
+			ip[0] = 255;
+			ip[1] = 63;
+		}
+		ip[2] = size / (ip[0] * ip[1]);
+	}
+	return 0;
 }
 
 /*
@@ -83,90 +82,90 @@
  *     capacity,unsigned int *cyls, unsigned int *hds, unsigned int *secs);
  *
  * Purpose : to determine the BIOS mapping used to create the partition
- *	table, storing the results in *cyls, *hds, and *secs 
+ *      table, storing the results in *cyls, *hds, and *secs 
  *
  * Returns : -1 on failure, 0 on success.
  *
  */
 
 int scsi_partsize(struct buffer_head *bh, unsigned long capacity,
-    unsigned int  *cyls, unsigned int *hds, unsigned int *secs) {
-    struct partition *p, *largest = NULL;
-    int i, largest_cyl;
-    int cyl, ext_cyl, end_head, end_cyl, end_sector;
-    unsigned int logical_end, physical_end, ext_physical_end;
-    
-
-    if (*(unsigned short *) (bh->b_data+510) == 0xAA55) {
-	for (largest_cyl = -1, p = (struct partition *) 
-    	    (0x1BE + bh->b_data), i = 0; i < 4; ++i, ++p) {
-    	    if (!p->sys_ind)
-    	    	continue;
+	       unsigned int *cyls, unsigned int *hds, unsigned int *secs)
+{
+	struct partition *p, *largest = NULL;
+	int i, largest_cyl;
+	int cyl, ext_cyl, end_head, end_cyl, end_sector;
+	unsigned int logical_end, physical_end, ext_physical_end;
+
+
+	if (*(unsigned short *) (bh->b_data + 510) == 0xAA55) {
+		for (largest_cyl = -1, p = (struct partition *)
+		     (0x1BE + bh->b_data), i = 0; i < 4; ++i, ++p) {
+			if (!p->sys_ind)
+				continue;
 #ifdef DEBUG
-	printk ("scsicam_bios_param : partition %d has system \n",
-	    i);
+			printk("scsicam_bios_param : partition %d has system \n",
+			       i);
 #endif
-    	    cyl = p->cyl + ((p->sector & 0xc0) << 2);
-    	    if (cyl > largest_cyl) {
-    	    	largest_cyl = cyl;
-    	    	largest = p;
-    	    }
-    	}
-    }
-
-    if (largest) {
-    	end_cyl = largest->end_cyl + ((largest->end_sector & 0xc0) << 2);
-    	end_head = largest->end_head;
-    	end_sector = largest->end_sector & 0x3f;
+			cyl = p->cyl + ((p->sector & 0xc0) << 2);
+			if (cyl > largest_cyl) {
+				largest_cyl = cyl;
+				largest = p;
+			}
+		}
+	}
+	if (largest) {
+		end_cyl = largest->end_cyl + ((largest->end_sector & 0xc0) << 2);
+		end_head = largest->end_head;
+		end_sector = largest->end_sector & 0x3f;
 
-        if( end_head + 1 == 0 || end_sector == 0 ) return -1;
+		if (end_head + 1 == 0 || end_sector == 0)
+			return -1;
 
 #ifdef DEBUG
-	printk ("scsicam_bios_param : end at h = %d, c = %d, s = %d\n",
-	    end_head, end_cyl, end_sector);
+		printk("scsicam_bios_param : end at h = %d, c = %d, s = %d\n",
+		       end_head, end_cyl, end_sector);
 #endif
 
-    	physical_end =  end_cyl * (end_head + 1) * end_sector +
-    	    end_head * end_sector + end_sector;
+		physical_end = end_cyl * (end_head + 1) * end_sector +
+		    end_head * end_sector + end_sector;
 
-	/* This is the actual _sector_ number at the end */
-	logical_end = get_unaligned(&largest->start_sect)
-			+ get_unaligned(&largest->nr_sects);
-
-	/* This is for >1023 cylinders */
-        ext_cyl= (logical_end-(end_head * end_sector + end_sector))
-                                        /(end_head + 1) / end_sector;
-	ext_physical_end = ext_cyl * (end_head + 1) * end_sector +
-            end_head * end_sector + end_sector;
+		/* This is the actual _sector_ number at the end */
+		logical_end = get_unaligned(&largest->start_sect)
+		    + get_unaligned(&largest->nr_sects);
+
+		/* This is for >1023 cylinders */
+		ext_cyl = (logical_end - (end_head * end_sector + end_sector))
+		    / (end_head + 1) / end_sector;
+		ext_physical_end = ext_cyl * (end_head + 1) * end_sector +
+		    end_head * end_sector + end_sector;
 
 #ifdef DEBUG
-	printk("scsicam_bios_param : logical_end=%d physical_end=%d ext_physical_end=%d ext_cyl=%d\n"
-			,logical_end,physical_end,ext_physical_end,ext_cyl);
+		printk("scsicam_bios_param : logical_end=%d physical_end=%d ext_physical_end=%d ext_cyl=%d\n"
+		  ,logical_end, physical_end, ext_physical_end, ext_cyl);
 #endif
 
-    	if ((logical_end == physical_end) ||
-	    (end_cyl==1023 && ext_physical_end==logical_end)) {
-    	    *secs = end_sector;
-    	    *hds = end_head + 1;
-    	    *cyls = capacity / ((end_head + 1) * end_sector);
-    	    return 0;
-    	}
-	
+		if ((logical_end == physical_end) ||
+		  (end_cyl == 1023 && ext_physical_end == logical_end)) {
+			*secs = end_sector;
+			*hds = end_head + 1;
+			*cyls = capacity / ((end_head + 1) * end_sector);
+			return 0;
+		}
 #ifdef DEBUG
-	printk ("scsicam_bios_param : logical (%u) != physical (%u)\n",
-	    logical_end, physical_end);
+		printk("scsicam_bios_param : logical (%u) != physical (%u)\n",
+		       logical_end, physical_end);
 #endif
-    }
-    return -1;
+	}
+	return -1;
 }
 
 /*
  * Function : static int setsize(unsigned long capacity,unsigned int *cyls,
- *	unsigned int *hds, unsigned int *secs);
+ *      unsigned int *hds, unsigned int *secs);
  *
  * Purpose : to determine a near-optimal int 0x13 mapping for a
- *	SCSI disk in terms of lost space of size capacity, storing
- *	the results in *cyls, *hds, and *secs.
+ *      SCSI disk in terms of lost space of size capacity, storing
+ *      the results in *cyls, *hds, and *secs.
  *
  * Returns : -1 on failure, 0 on success.
  *
@@ -194,31 +193,33 @@
  * accommodated. This algorithm does not use physical geometry. 
  */
 
-static int setsize(unsigned long capacity,unsigned int *cyls,unsigned int *hds,
-    unsigned int *secs) { 
-    unsigned int rv = 0; 
-    unsigned long heads, sectors, cylinders, temp; 
-
-    cylinders = 1024L;			/* Set number of cylinders to max */ 
-    sectors = 62L;      		/* Maximize sectors per track */ 
-
-    temp = cylinders * sectors;		/* Compute divisor for heads */ 
-    heads = capacity / temp;		/* Compute value for number of heads */
-    if (capacity % temp) {		/* If no remainder, done! */ 
-    	heads++;                	/* Else, increment number of heads */ 
-    	temp = cylinders * heads;	/* Compute divisor for sectors */ 
-    	sectors = capacity / temp;	/* Compute value for sectors per
-					       track */ 
-    	if (capacity % temp) {		/* If no remainder, done! */ 
-      	    sectors++;                  /* Else, increment number of sectors */ 
-      	    temp = heads * sectors;	/* Compute divisor for cylinders */
-      	    cylinders = capacity / temp;/* Compute number of cylinders */ 
-      	} 
-    } 
-    if (cylinders == 0) rv=(unsigned)-1;/* Give error if 0 cylinders */ 
-
-    *cyls = (unsigned int) cylinders;	/* Stuff return values */ 
-    *secs = (unsigned int) sectors; 
-    *hds  = (unsigned int) heads; 
-    return(rv); 
-} 
+static int setsize(unsigned long capacity, unsigned int *cyls, unsigned int *hds,
+		   unsigned int *secs)
+{
+	unsigned int rv = 0;
+	unsigned long heads, sectors, cylinders, temp;
+
+	cylinders = 1024L;	/* Set number of cylinders to max */
+	sectors = 62L;		/* Maximize sectors per track */
+
+	temp = cylinders * sectors;	/* Compute divisor for heads */
+	heads = capacity / temp;	/* Compute value for number of heads */
+	if (capacity % temp) {	/* If no remainder, done! */
+		heads++;	/* Else, increment number of heads */
+		temp = cylinders * heads;	/* Compute divisor for sectors */
+		sectors = capacity / temp;	/* Compute value for sectors per
+						   track */
+		if (capacity % temp) {	/* If no remainder, done! */
+			sectors++;	/* Else, increment number of sectors */
+			temp = heads * sectors;		/* Compute divisor for cylinders */
+			cylinders = capacity / temp;	/* Compute number of cylinders */
+		}
+	}
+	if (cylinders == 0)
+		rv = (unsigned) -1;	/* Give error if 0 cylinders */
+
+	*cyls = (unsigned int) cylinders;	/* Stuff return values */
+	*secs = (unsigned int) sectors;
+	*hds = (unsigned int) heads;
+	return (rv);
+}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)