Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a121411 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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
parents c07f62e5 2642b112
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -370,6 +370,11 @@ static const struct {
		.model			= 0x000021,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod mini */ {
		.firmware_revision	= 0x0a2700,
		.model			= 0x000022,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod mini */ {
		.firmware_revision	= 0x0a2700,
		.model			= 0x000023,
+12 −13
Original line number Diff line number Diff line
@@ -46,10 +46,6 @@ static DEFINE_RWLOCK(hl_irqs_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,
					    struct hpsb_host *host)
@@ -481,20 +477,23 @@ int hpsb_unregister_addrspace(struct hpsb_highlevel *hl, struct hpsb_host *host,
	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)
{
	INIT_LIST_HEAD(&dummy_zero_addr.host_list);
	INIT_LIST_HEAD(&dummy_zero_addr.hl_list);
	INIT_LIST_HEAD(&dummy_max_addr.host_list);
	INIT_LIST_HEAD(&dummy_max_addr.hl_list);
	INIT_LIST_HEAD(&host->dummy_zero_addr.host_list);
	INIT_LIST_HEAD(&host->dummy_zero_addr.hl_list);
	INIT_LIST_HEAD(&host->dummy_max_addr.host_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;
	dummy_max_addr.start = dummy_max_addr.end = ((u64) 1) << 48;
	host->dummy_zero_addr.start = host->dummy_zero_addr.end = 0;
	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(&dummy_max_addr.host_list, &host->addr_space);
	list_add_tail(&host->dummy_zero_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)
+4 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ struct module;

#include "ieee1394_types.h"
#include "csr.h"
#include "highlevel.h"

struct hpsb_packet;
struct hpsb_iso;
@@ -72,6 +73,9 @@ struct hpsb_host {
	struct { DECLARE_BITMAP(map, 64); } tl_pool[ALL_NODES];

	struct csr_control csr;

	struct hpsb_address_serve dummy_zero_addr;
	struct hpsb_address_serve dummy_max_addr;
};

enum devctl_cmd {
+10 −4
Original line number Diff line number Diff line
@@ -400,6 +400,11 @@ static const struct {
		.model_id		= 0x000021,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod mini */ {
		.firmware_revision	= 0x0a2700,
		.model_id		= 0x000022,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod mini */ {
		.firmware_revision	= 0x0a2700,
		.model_id		= 0x000023,
@@ -890,12 +895,13 @@ static void sbp2_host_reset(struct hpsb_host *host)
		return;

	read_lock_irqsave(&sbp2_hi_logical_units_lock, flags);

	list_for_each_entry(lu, &hi->logical_units, lu_list)
		if (likely(atomic_read(&lu->state) !=
			   SBP2LU_STATE_IN_SHUTDOWN)) {
			atomic_set(&lu->state, SBP2LU_STATE_IN_RESET);
		if (atomic_cmpxchg(&lu->state,
				   SBP2LU_STATE_RUNNING, SBP2LU_STATE_IN_RESET)
		    == SBP2LU_STATE_RUNNING)
			scsi_block_requests(lu->shost);
		}

	read_unlock_irqrestore(&sbp2_hi_logical_units_lock, flags);
}