Skip to contentSkip to conversation

ultrastor.c is a bit-rot

DISCUSSION Boaz Harrosh 7 participants 14 messages Mar 17, 2008 – Mar 23, 2008 SCSI

lore
Share & tools
lore
#0 lore raw

Inspecting ultrastor.c it is clear to me that this was never used for a loooooooooong time. Not since a PC has more then 2^24 bit of memory. Let me explain below.

Now I'm not saying it should be fixed. I'm saying that it should be dumped in the account that it is not used by any one and that it does not work.

Why it never worked?
~~~~~~~~~~~~~~~~~~~~~

The driver's header says it supports 3 cards

* 14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
* 24F - EISA Bus Master HA with floppy support and WD1003 emulation.
* 34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).

But Kconfig only specifies ISA. I'm not sure what a VL-Bus is.

now the driver defines a static array of structures like this:

	struct {
	  ...
	
	  struct mscp mscp[ULTRASTOR_MAX_CMDS];
	} config = {0};

and allocates a struct mscp in .queuecommand like this:

	    my_mscp = &config.mscp[mscp_index];

it will go on preparing this my_mscp structure including stuffing some mapped pointers. Lets put that aside for now.
At the very end it will pass this my_mscp structure to the card's firmware like this:

	    /* Store pointer in OGM address bytes */
	outl(isa_virt_to_bus(my_mscp), config.ogm_address);

Now this is one hell of a smart ISA card. But putting this aside.

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

(Also none of the emails in this file are valid)

Boaz

maintainer
#1 lore raw
Quoted 10 lines · Boaz Harrosh

Inspecting ultrastor.c it is clear to me that this was never used for a loooooooooong time. Not since a PC has more then 2^24 bit of memory. Let me explain below.

Now I'm not saying it should be fixed. I'm saying that it should be dumped in the account that it is not used by any one and that it does not work.

Why it never worked?
~~~~~~~~~~~~~~~~~~~~~

Quoted 7 lines

The driver's header says it supports 3 cards

* 14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
* 24F - EISA Bus Master HA with floppy support and WD1003 emulation.
* 34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).

But Kconfig only specifies ISA. I'm not sure what a VL-Bus is.

VL is vesa local ... it was an ISA like graphics bus that was fast and could reach > 16MB.

Quoted 16 lines

now the driver defines a static array of structures like this:

	struct {
	  ...
	
	  struct mscp mscp[ULTRASTOR_MAX_CMDS];
	} config = {0};

and allocates a struct mscp in .queuecommand like this:

	    my_mscp = &config.mscp[mscp_index];

it will go on preparing this my_mscp structure including stuffing some mapped pointers. Lets put that aside for now.
At the very end it will pass this my_mscp structure to the card's firmware like this:

Quoted 7 lines
	    /* Store pointer in OGM address bytes */
	outl(isa_virt_to_bus(my_mscp), config.ogm_address);

Now this is one hell of a smart ISA card. But putting this aside.

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

It will definitely work for EISA and VL bus. I think if you analyse the placement of kernel data segments for compiled in drivers, it might also work for ISA too, since I think the pfn will be low enough. It should fail as a module not just because the area will be out of range for ISA, but also because the module data segment is in vmalloc space, so the virt_to_bus assumptions of contiguity could be violated.

James

#2 lore raw
Quoted 46 lines · James Bottomley
Quoted 10 lines · Boaz Harrosh

Inspecting ultrastor.c it is clear to me that this was never used for a loooooooooong time. Not since a PC has more then 2^24 bit of memory. Let me explain below.

Now I'm not saying it should be fixed. I'm saying that it should be dumped in the account that it is not used by any one and that it does not work.

Why it never worked?
~~~~~~~~~~~~~~~~~~~~~

Quoted 7 lines

The driver's header says it supports 3 cards

* 14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
* 24F - EISA Bus Master HA with floppy support and WD1003 emulation.
* 34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).

But Kconfig only specifies ISA. I'm not sure what a VL-Bus is.

VL is vesa local ... it was an ISA like graphics bus that was fast and could reach > 16MB.

Quoted 16 lines

now the driver defines a static array of structures like this:

	struct {
	  ...
	
	  struct mscp mscp[ULTRASTOR_MAX_CMDS];
	} config = {0};

and allocates a struct mscp in .queuecommand like this:

	    my_mscp = &config.mscp[mscp_index];

it will go on preparing this my_mscp structure including stuffing some mapped pointers. Lets put that aside for now.
At the very end it will pass this my_mscp structure to the card's firmware like this:

Quoted 7 lines
	    /* Store pointer in OGM address bytes */
	outl(isa_virt_to_bus(my_mscp), config.ogm_address);

Now this is one hell of a smart ISA card. But putting this aside.

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

Quoted 9 lines

It will definitely work for EISA and VL bus. I think if you analyse the placement of kernel data segments for compiled in drivers, it might also work for ISA too, since I think the pfn will be low enough. It should fail as a module not just because the area will be out of range for ISA, but also because the module data segment is in vmalloc space, so the virt_to_bus assumptions of contiguity could be violated.

James

So what is the verdict? is it removed? marked broken for ISA?

can I safely say that unchecked_isa_dma can be removed?

Boaz

maintainer
#3 lore raw
Quoted 54 lines · Boaz Harrosh
Quoted 53 lines · James Bottomley
Quoted 10 lines · Boaz Harrosh

Inspecting ultrastor.c it is clear to me that this was never used for a loooooooooong time. Not since a PC has more then 2^24 bit of memory. Let me explain below.

Now I'm not saying it should be fixed. I'm saying that it should be dumped in the account that it is not used by any one and that it does not work.

Why it never worked?
~~~~~~~~~~~~~~~~~~~~~

Quoted 7 lines

The driver's header says it supports 3 cards

* 14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
* 24F - EISA Bus Master HA with floppy support and WD1003 emulation.
* 34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).

But Kconfig only specifies ISA. I'm not sure what a VL-Bus is.

VL is vesa local ... it was an ISA like graphics bus that was fast and could reach > 16MB.

Quoted 16 lines

now the driver defines a static array of structures like this:

	struct {
	  ...
	
	  struct mscp mscp[ULTRASTOR_MAX_CMDS];
	} config = {0};

and allocates a struct mscp in .queuecommand like this:

	    my_mscp = &config.mscp[mscp_index];

it will go on preparing this my_mscp structure including stuffing some mapped pointers. Lets put that aside for now.
At the very end it will pass this my_mscp structure to the card's firmware like this:

Quoted 7 lines
	    /* Store pointer in OGM address bytes */
	outl(isa_virt_to_bus(my_mscp), config.ogm_address);

Now this is one hell of a smart ISA card. But putting this aside.

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

It will definitely work for EISA and VL bus. I think if you analyse the placement of kernel data segments for compiled in drivers, it might also work for ISA too, since I think the pfn will be low enough. It should fail as a module not just because the area will be out of range for ISA, but also because the module data segment is in vmalloc space, so the virt_to_bus assumptions of contiguity could be violated.

Quoted 4 lines
Quoted 2 lines

James

So what is the verdict? is it removed? marked broken for ISA?

It's probably obvious enough to apply the best straight line fix.

Quoted 1 line

can I safely say that unchecked_isa_dma can be removed?

No ... ISA definitely requires it.

James

#4 lore raw
Quoted 57 lines · James Bottomley
Quoted 52 lines · Boaz Harrosh
Quoted 51 lines · James Bottomley
Quoted 10 lines · Boaz Harrosh

Inspecting ultrastor.c it is clear to me that this was never used for a loooooooooong time. Not since a PC has more then 2^24 bit of memory. Let me explain below.

Now I'm not saying it should be fixed. I'm saying that it should be dumped in the account that it is not used by any one and that it does not work.

Why it never worked?
~~~~~~~~~~~~~~~~~~~~~

Quoted 7 lines

The driver's header says it supports 3 cards

* 14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
* 24F - EISA Bus Master HA with floppy support and WD1003 emulation.
* 34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).

But Kconfig only specifies ISA. I'm not sure what a VL-Bus is.

VL is vesa local ... it was an ISA like graphics bus that was fast and could reach > 16MB.

Quoted 16 lines

now the driver defines a static array of structures like this:

	struct {
	  ...
	
	  struct mscp mscp[ULTRASTOR_MAX_CMDS];
	} config = {0};

and allocates a struct mscp in .queuecommand like this:

	    my_mscp = &config.mscp[mscp_index];

it will go on preparing this my_mscp structure including stuffing some mapped pointers. Lets put that aside for now.
At the very end it will pass this my_mscp structure to the card's firmware like this:

Quoted 7 lines
	    /* Store pointer in OGM address bytes */
	outl(isa_virt_to_bus(my_mscp), config.ogm_address);

Now this is one hell of a smart ISA card. But putting this aside.

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

It will definitely work for EISA and VL bus. I think if you analyse the placement of kernel data segments for compiled in drivers, it might also work for ISA too, since I think the pfn will be low enough. It should fail as a module not just because the area will be out of range for ISA, but also because the module data segment is in vmalloc space, so the virt_to_bus assumptions of contiguity could be violated.

Quoted 3 lines
Quoted 2 lines

James

So what is the verdict? is it removed? marked broken for ISA?

Quoted 8 lines

It's probably obvious enough to apply the best straight line fix.

Quoted 1 line

can I safely say that unchecked_isa_dma can be removed?

No ... ISA definitely requires it.

James

In Hebrew we say: "You make me drink Kerosene".
An "obvious enough to apply the best straight line fix" submitted below:

I say dump it, it's unused.

Boaz
---
From: Boaz Harrosh <[email protected]>
Date: Mon, 17 Mar 2008 18:40:03 +0200
Subject: [PATCH] ultrastor: Fix for ISA DMA allocation

"obvious enough to apply the best straight line fix" submitted below.

---
 drivers/scsi/ultrastor.c |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)
drivers/scsi/ultrastor.c +21 -3
index f385dce..04441eb 100644
@@ -255,8 +255,9 @@ static struct ultrastor_config
   unsigned long mscp_free;
 #endif
   volatile unsigned char aborted[ULTRASTOR_MAX_CMDS];
-  struct mscp mscp[ULTRASTOR_MAX_CMDS];
-} config = {0};
+  struct mscp *mscp;
+  dma_addr_t dma;
+} config;
 
 /* Set this to 1 to reset the SCSI bus on error.  */
 static int ultrastor_bus_reset;
@@ -646,12 +647,29 @@ static int ultrastor_24f_detect(struct scsi_host_template * tpnt)
 
 static int ultrastor_detect(struct scsi_host_template * tpnt)
 {
+	int ret;
+
 	tpnt->proc_name = "ultrastor";
-	return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
+
+	if (!config.mscp)
+		config.mscp = dma_alloc_coherent(NULL,
+			sizeof(*config.mscp) * ULTRASTOR_MAX_CMDS,
+			&config.dma, GFP_KERNEL);
+
+	ret = ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
+
+	if (!ret)
+		dma_free_coherent(NULL,
+			sizeof(*config.mscp) * ULTRASTOR_MAX_CMDS,
+			config.mscp, config.dma);
+	return ret;
 }
 
 static int ultrastor_release(struct Scsi_Host *shost)
 {
+	dma_free_coherent(NULL, sizeof(*config.mscp) * ULTRASTOR_MAX_CMDS,
+			  config.mscp, config.dma);
+
 	if (shost->irq)
 		free_irq(shost->irq, NULL);
 	if (shost->dma_channel != 0xff)
Signature · 1 line
1.5.3.3
maintainer
#5 lore raw
Quoted 1 line · Boaz Harrosh

In Hebrew we say: "You make me drink Kerosene".

Slàinte mhath as we say in English.

Quoted 38 lines

An "obvious enough to apply the best straight line fix" submitted below:

I say dump it, it's unused.

Boaz
---
From: Boaz Harrosh <[email protected]>
Date: Mon, 17 Mar 2008 18:40:03 +0200
Subject: [PATCH] ultrastor: Fix for ISA DMA allocation

"obvious enough to apply the best straight line fix" submitted below.

---
 drivers/scsi/ultrastor.c |   24 +++++++++++++++++++++---
 1 files changed, 21 insertions(+), 3 deletions(-)
drivers/scsi/ultrastor.c +3 -2
index f385dce..04441eb 100644
@@ -255,8 +255,9 @@ static struct ultrastor_config
   unsigned long mscp_free;
 #endif
   volatile unsigned char aborted[ULTRASTOR_MAX_CMDS];
-  struct mscp mscp[ULTRASTOR_MAX_CMDS];
-} config = {0};
+  struct mscp *mscp;
+  dma_addr_t dma;
+} config;
 
 /* Set this to 1 to reset the SCSI bus on error.  */
 static int ultrastor_bus_reset;
@@ -646,12 +647,29 @@ static int ultrastor_24f_detect(struct scsi_host_template * tpnt)
 
 static int ultrastor_detect(struct scsi_host_template * tpnt)

drivers/scsi/ultrastor.c static int ultrastor_24f_detect(struct scsi_host_template * tpnt) · line 657

Quoted 10 lines
drivers/scsi/ultrastor.c +7 -1
 {
+	int ret;
+
 	tpnt->proc_name = "ultrastor";
-	return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
+
+	if (!config.mscp)
+		config.mscp = dma_alloc_coherent(NULL,
+			sizeof(*config.mscp) * ULTRASTOR_MAX_CMDS,
+			&config.dma, GFP_KERNEL);

Error handling here, I'm afraid; dma_alloc_coherent can return NULL.

Other than that, looks great.

James

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#6 lore raw
In reply to Boaz Harrosh
Quoted 7 lines · Boaz Harrosh

The driver's header says it supports 3 cards

* 14F - ISA first-party DMA HA with floppy support and WD1003 emulation.
* 24F - EISA Bus Master HA with floppy support and WD1003 emulation.
* 34F - VL-Bus Bus Master HA with floppy support (no WD1003 emulation).

But Kconfig only specifies ISA. I'm not sure what a VL-Bus is.

VESA Local Bus. It was (in some sense) the predecessor of AGP. We treat it like ISA inside the kernel. On x86, EISA depends on ISA, so the dependency, while wrong, does not affect any x86 users who have an EISA card.

Quoted 16 lines

now the driver defines a static array of structures like this:

	struct {
	  ...
	
	  struct mscp mscp[ULTRASTOR_MAX_CMDS];
	} config = {0};

and allocates a struct mscp in .queuecommand like this:

	    my_mscp = &config.mscp[mscp_index];

it will go on preparing this my_mscp structure including stuffing some mapped pointers. Lets put that aside for now.
At the very end it will pass this my_mscp structure to the card's firmware like this:

Quoted 7 lines
	    /* Store pointer in OGM address bytes */
	outl(isa_virt_to_bus(my_mscp), config.ogm_address);

Now this is one hell of a smart ISA card. But putting this aside.

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

I believe this will work for VESA and EISA cards, though not, indeed for ISA cards.

Quoted 1 line

(Also none of the emails in this file are valid)

That doesn't mean it doesn't have users ...

On the other hand, the u14-34f driver is supposed to be preferred to the ultrastor drivers. Only problem: it doesn't support the 24F card.

Signature · 4 lines
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours.  We can't possibly take such
a retrograde step."
#7 lore raw
Quoted 6 lines · Matthew Wilcox

VESA Local Bus. It was (in some sense) the predecessor of AGP. We treat it like ISA inside the kernel. On x86, EISA depends on ISA, so the dependency, while wrong, does not affect any x86 users who have an EISA card.

Well, one can say VLB was to ISA (a souped-up ISA bus with some of the worst limitations removed) what AGP is to PCI...

-hpa

#8 lore raw
Quoted 11 lines · H. Peter Anvin
Quoted 5 lines · Matthew Wilcox

VESA Local Bus. It was (in some sense) the predecessor of AGP. We treat it like ISA inside the kernel. On x86, EISA depends on ISA, so the dependency, while wrong, does not affect any x86 users who have an EISA card.

Well, one can say VLB was to ISA (a souped-up ISA bus with some of the worst limitations removed) what AGP is to PCI...

-hpa

Hmm interesting, so someone took the VGA thing and made a storage device for it. Did that ever happen with AGP? Any AGP scsi cards. I guess I can Google for it.

Boaz

#9 lore raw
Quoted 7 lines · Boaz Harrosh
Quoted 6 lines · H. Peter Anvin
Quoted 5 lines · Matthew Wilcox

VESA Local Bus. It was (in some sense) the predecessor of AGP. We treat it like ISA inside the kernel. On x86, EISA depends on ISA, so the dependency, while wrong, does not affect any x86 users who have an EISA card.

Quoted 7 lines
Quoted 3 lines

Well, one can say VLB was to ISA (a souped-up ISA bus with some of the worst limitations removed) what AGP is to PCI...

-hpa

Hmm interesting, so someone took the VGA thing and made a storage device for it. Did that ever happen with AGP? Any AGP scsi cards. I guess I can Google for it.

A lot less likely, IMO. Unlike AGP-PCI, VLB slots were compatible with ISA cards, and the electricals were less complex, so several motherboard manufacturers built boards with 3 or more VESA slots (I think I saw a board with 6 at one point.)

AGP electricals pretty much require that it be point to point.

-hpa

#10 lore raw
Quoted 10 lines · H. Peter Anvin
Quoted 3 lines

Hmm interesting, so someone took the VGA thing and made a storage device for it. Did that ever happen with AGP? Any AGP scsi cards. I guess I can Google for it.

A lot less likely, IMO. Unlike AGP-PCI, VLB slots were compatible with ISA cards, and the electricals were less complex, so several motherboard manufacturers built boards with 3 or more VESA slots (I think I saw a board with 6 at one point.)

AGP electricals pretty much require that it be point to point.

... not that VLB didn't suck badly with several devices attached at the same time. I would be rather surprised if that board would work if fully populated with VLB cards, all in active use. IOW, a likely explanation is that it had a warning along the lines of "use of more than <number> of VLB cards at the same time may use instability" buried in documentation and proud "6 VLB slots!!!" touted by marketing...

I can't find VLB specs online, but IIRC 3 had been the limit and anything past that had been very much out of spec and likely to screw you.

#11 lore raw
Quoted 10 lines · Al Viro

... not that VLB didn't suck badly with several devices attached at the same time. I would be rather surprised if that board would work if fully populated with VLB cards, all in active use. IOW, a likely explanation is that it had a warning along the lines of "use of more than <number> of VLB cards at the same time may use instability" buried in documentation and proud "6 VLB slots!!!" touted by marketing...

I can't find VLB specs online, but IIRC 3 had been the limit and anything past that had been very much out of spec and likely to screw you.

I think that particular board had multiple root drivers (it was a P5 board, so it wasn't a "local" bus anyway.)

-hpa

#12 lore raw
In reply to Boaz Harrosh
Quoted 2 lines

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

It will work compiled in, and probably users of such cards if any don't have > 16MB. I doubt anyone is using the driver however.

Alan

#13 lore raw
In reply to Boaz Harrosh
Quoted 2 lines · Boaz Harrosh

if the machine has more then 2^24 of memory. Then this will never work, right? or I'm missing it completely?

I used to have a machine with the VL-bus version of that card. I spent a fortune upgrading that machine from 8x1MB to 4x4MB + 4x1MB, so it did indeed work with larger than 16MB. The card got awfully hot and it only worked when clocked at 33MHz (not the 40MHz the PC could do without the card), but otherwise it worked fine.

I'm not sure whether that machine made it to kernel 2.0 though.

/Benny