Commit ee0d7c25 authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Linus Torvalds

[PATCH] Atari NCR5380 SCSI: bitops operate on long

Atari NCR5380 SCSI driver tag bitmap updates:
  - Use DECLARE_BITMAP() to declare the tag bitmap
  - Remove `MAX_TAGS must be a multiple of 32', which is no longer true
  - Declare and use CLEAR_BITMAP() to set all bits in a bitmap to zero
  - Fix bitops call problems that got unnoticed before
parent d04aa049
...@@ -309,13 +309,8 @@ static Scsi_Host_Template *the_template = NULL; ...@@ -309,13 +309,8 @@ static Scsi_Host_Template *the_template = NULL;
#undef TAG_NONE #undef TAG_NONE
#define TAG_NONE 0xff #define TAG_NONE 0xff
/* For the m68k, the number of bits in 'allocated' must be a multiple of 32! */
#if (MAX_TAGS % 32) != 0
#error "MAX_TAGS must be a multiple of 32!"
#endif
typedef struct { typedef struct {
long allocated[MAX_TAGS/32]; DECLARE_BITMAP(allocated, MAX_TAGS);
int nr_allocated; int nr_allocated;
int queue_size; int queue_size;
} TAG_ALLOC; } TAG_ALLOC;
...@@ -334,7 +329,7 @@ static void __init init_tags( void ) ...@@ -334,7 +329,7 @@ static void __init init_tags( void )
for( target = 0; target < 8; ++target ) { for( target = 0; target < 8; ++target ) {
for( lun = 0; lun < 8; ++lun ) { for( lun = 0; lun < 8; ++lun ) {
ta = &TagAlloc[target][lun]; ta = &TagAlloc[target][lun];
memset( &ta->allocated, 0, MAX_TAGS/8 ); CLEAR_BITMAP( ta->allocated, MAX_TAGS );
ta->nr_allocated = 0; ta->nr_allocated = 0;
/* At the beginning, assume the maximum queue size we could /* At the beginning, assume the maximum queue size we could
* support (MAX_TAGS). This value will be decreased if the target * support (MAX_TAGS). This value will be decreased if the target
...@@ -394,8 +389,8 @@ static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged ) ...@@ -394,8 +389,8 @@ static void cmd_get_tag( Scsi_Cmnd *cmd, int should_be_tagged )
else { else {
TAG_ALLOC *ta = &TagAlloc[cmd->target][cmd->lun]; TAG_ALLOC *ta = &TagAlloc[cmd->target][cmd->lun];
cmd->tag = find_first_zero_bit( &ta->allocated, MAX_TAGS ); cmd->tag = find_first_zero_bit( ta->allocated, MAX_TAGS );
set_bit( cmd->tag, &ta->allocated ); set_bit( cmd->tag, ta->allocated );
ta->nr_allocated++; ta->nr_allocated++;
TAG_PRINTK( "scsi%d: using tag %d for target %d lun %d " TAG_PRINTK( "scsi%d: using tag %d for target %d lun %d "
"(now %d tags in use)\n", "(now %d tags in use)\n",
...@@ -424,7 +419,7 @@ static void cmd_free_tag( Scsi_Cmnd *cmd ) ...@@ -424,7 +419,7 @@ static void cmd_free_tag( Scsi_Cmnd *cmd )
} }
else { else {
TAG_ALLOC *ta = &TagAlloc[cmd->target][cmd->lun]; TAG_ALLOC *ta = &TagAlloc[cmd->target][cmd->lun];
clear_bit( cmd->tag, &ta->allocated ); clear_bit( cmd->tag, ta->allocated );
ta->nr_allocated--; ta->nr_allocated--;
TAG_PRINTK( "scsi%d: freed tag %d for target %d lun %d\n", TAG_PRINTK( "scsi%d: freed tag %d for target %d lun %d\n",
H_NO(cmd), cmd->tag, cmd->target, cmd->lun ); H_NO(cmd), cmd->tag, cmd->target, cmd->lun );
...@@ -443,7 +438,7 @@ static void free_all_tags( void ) ...@@ -443,7 +438,7 @@ static void free_all_tags( void )
for( target = 0; target < 8; ++target ) { for( target = 0; target < 8; ++target ) {
for( lun = 0; lun < 8; ++lun ) { for( lun = 0; lun < 8; ++lun ) {
ta = &TagAlloc[target][lun]; ta = &TagAlloc[target][lun];
memset( &ta->allocated, 0, MAX_TAGS/8 ); CLEAR_BITMAP( ta->allocated, MAX_TAGS );
ta->nr_allocated = 0; ta->nr_allocated = 0;
} }
} }
......
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#define DECLARE_BITMAP(name,bits) \ #define DECLARE_BITMAP(name,bits) \
unsigned long name[((bits)+BITS_PER_LONG-1)/BITS_PER_LONG] unsigned long name[((bits)+BITS_PER_LONG-1)/BITS_PER_LONG]
#define CLEAR_BITMAP(name,bits) \
memset(name, 0, ((bits)+BITS_PER_LONG-1)/8)
#endif #endif
#include <linux/posix_types.h> #include <linux/posix_types.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment