Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6: ieee1394: sbp2: fix race condition in state change ieee1394: fix list corruption (reported at module removal) firewire: fw-sbp2: another iPod mini quirk entry ieee1394: sbp2: another iPod mini quirk entry
This commit is contained in:
commit
6a12141130
@ -370,6 +370,11 @@ static const struct {
|
|||||||
.model = 0x000021,
|
.model = 0x000021,
|
||||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||||
},
|
},
|
||||||
|
/* iPod mini */ {
|
||||||
|
.firmware_revision = 0x0a2700,
|
||||||
|
.model = 0x000022,
|
||||||
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||||
|
},
|
||||||
/* iPod mini */ {
|
/* iPod mini */ {
|
||||||
.firmware_revision = 0x0a2700,
|
.firmware_revision = 0x0a2700,
|
||||||
.model = 0x000023,
|
.model = 0x000023,
|
||||||
|
@ -46,10 +46,6 @@ static DEFINE_RWLOCK(hl_irqs_lock);
|
|||||||
|
|
||||||
static DEFINE_RWLOCK(addr_space_lock);
|
static DEFINE_RWLOCK(addr_space_lock);
|
||||||
|
|
||||||
/* addr_space list will have zero and max already included as bounds */
|
|
||||||
static struct hpsb_address_ops dummy_ops = { NULL, NULL, NULL, NULL };
|
|
||||||
static struct hpsb_address_serve dummy_zero_addr, dummy_max_addr;
|
|
||||||
|
|
||||||
|
|
||||||
static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl,
|
static struct hl_host_info *hl_get_hostinfo(struct hpsb_highlevel *hl,
|
||||||
struct hpsb_host *host)
|
struct hpsb_host *host)
|
||||||
@ -481,20 +477,23 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host,
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct hpsb_address_ops dummy_ops;
|
||||||
|
|
||||||
|
/* dummy address spaces as lower and upper bounds of the host's a.s. list */
|
||||||
static void init_hpsb_highlevel(struct hpsb_host *host)
|
static void init_hpsb_highlevel(struct hpsb_host *host)
|
||||||
{
|
{
|
||||||
INIT_LIST_HEAD(&dummy_zero_addr.host_list);
|
INIT_LIST_HEAD(&host->dummy_zero_addr.host_list);
|
||||||
INIT_LIST_HEAD(&dummy_zero_addr.hl_list);
|
INIT_LIST_HEAD(&host->dummy_zero_addr.hl_list);
|
||||||
INIT_LIST_HEAD(&dummy_max_addr.host_list);
|
INIT_LIST_HEAD(&host->dummy_max_addr.host_list);
|
||||||
INIT_LIST_HEAD(&dummy_max_addr.hl_list);
|
INIT_LIST_HEAD(&host->dummy_max_addr.hl_list);
|
||||||
|
|
||||||
dummy_zero_addr.op = dummy_max_addr.op = &dummy_ops;
|
host->dummy_zero_addr.op = host->dummy_max_addr.op = &dummy_ops;
|
||||||
|
|
||||||
dummy_zero_addr.start = dummy_zero_addr.end = 0;
|
host->dummy_zero_addr.start = host->dummy_zero_addr.end = 0;
|
||||||
dummy_max_addr.start = dummy_max_addr.end = ((u64) 1) << 48;
|
host->dummy_max_addr.start = host->dummy_max_addr.end = ((u64) 1) << 48;
|
||||||
|
|
||||||
list_add_tail(&dummy_zero_addr.host_list, &host->addr_space);
|
list_add_tail(&host->dummy_zero_addr.host_list, &host->addr_space);
|
||||||
list_add_tail(&dummy_max_addr.host_list, &host->addr_space);
|
list_add_tail(&host->dummy_max_addr.host_list, &host->addr_space);
|
||||||
}
|
}
|
||||||
|
|
||||||
void highlevel_add_host(struct hpsb_host *host)
|
void highlevel_add_host(struct hpsb_host *host)
|
||||||
|
@ -13,6 +13,7 @@ struct module;
|
|||||||
|
|
||||||
#include "ieee1394_types.h"
|
#include "ieee1394_types.h"
|
||||||
#include "csr.h"
|
#include "csr.h"
|
||||||
|
#include "highlevel.h"
|
||||||
|
|
||||||
struct hpsb_packet;
|
struct hpsb_packet;
|
||||||
struct hpsb_iso;
|
struct hpsb_iso;
|
||||||
@ -72,6 +73,9 @@ struct hpsb_host {
|
|||||||
struct { DECLARE_BITMAP(map, 64); } tl_pool[ALL_NODES];
|
struct { DECLARE_BITMAP(map, 64); } tl_pool[ALL_NODES];
|
||||||
|
|
||||||
struct csr_control csr;
|
struct csr_control csr;
|
||||||
|
|
||||||
|
struct hpsb_address_serve dummy_zero_addr;
|
||||||
|
struct hpsb_address_serve dummy_max_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum devctl_cmd {
|
enum devctl_cmd {
|
||||||
|
@ -400,6 +400,11 @@ static const struct {
|
|||||||
.model_id = 0x000021,
|
.model_id = 0x000021,
|
||||||
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||||
},
|
},
|
||||||
|
/* iPod mini */ {
|
||||||
|
.firmware_revision = 0x0a2700,
|
||||||
|
.model_id = 0x000022,
|
||||||
|
.workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
|
||||||
|
},
|
||||||
/* iPod mini */ {
|
/* iPod mini */ {
|
||||||
.firmware_revision = 0x0a2700,
|
.firmware_revision = 0x0a2700,
|
||||||
.model_id = 0x000023,
|
.model_id = 0x000023,
|
||||||
@ -890,12 +895,13 @@ static void sbp2_host_reset(struct hpsb_host *host)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
read_lock_irqsave(&sbp2_hi_logical_units_lock, flags);
|
read_lock_irqsave(&sbp2_hi_logical_units_lock, flags);
|
||||||
|
|
||||||
list_for_each_entry(lu, &hi->logical_units, lu_list)
|
list_for_each_entry(lu, &hi->logical_units, lu_list)
|
||||||
if (likely(atomic_read(&lu->state) !=
|
if (atomic_cmpxchg(&lu->state,
|
||||||
SBP2LU_STATE_IN_SHUTDOWN)) {
|
SBP2LU_STATE_RUNNING, SBP2LU_STATE_IN_RESET)
|
||||||
atomic_set(&lu->state, SBP2LU_STATE_IN_RESET);
|
== SBP2LU_STATE_RUNNING)
|
||||||
scsi_block_requests(lu->shost);
|
scsi_block_requests(lu->shost);
|
||||||
}
|
|
||||||
read_unlock_irqrestore(&sbp2_hi_logical_units_lock, flags);
|
read_unlock_irqrestore(&sbp2_hi_logical_units_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user