/**
 * Copyright (C) 2008, Creative Technology Ltd. All Rights Reserved.
 *
 * This source file is released under GPL v2 license (no other versions).
 * See the COPYING file included in the main directory of this source
 * distribution for the license terms and conditions.
 *
 * @File	cthardware.c
 *
 * @Brief
 * This file contains the implementation of hardware access methord.
 *
 * @Author	Liu Chun
 * @Date 	Jun 26 2008
 *
 */

#include "cthardware.h"
#include "cthw20k1.h"
#include "cthw20k2.h"
#include <linux/bug.h>

int create_hw_obj(struct pci_dev *pci, enum CHIPTYP chip_type,
		  enum CTCARDS model, struct hw **rhw)
{
	int err;

	switch (chip_type) {
	case ATC20K1:
		err = create_20k1_hw_obj(rhw);
		break;
	case ATC20K2:
		err = create_20k2_hw_obj(rhw);
		break;
	default:
		err = -ENODEV;
		break;
	}
	if (err)
		return err;

	(*rhw)->pci = pci;
	(*rhw)->chip_type = chip_type;
	(*rhw)->model = model;

	return 0;
}

int destroy_hw_obj(struct hw *hw)
{
	int err;

	switch (hw->pci->device) {
	case 0x0005:	/* 20k1 device */
		err = destroy_20k1_hw_obj(hw);
		break;
	case 0x000B:	/* 20k2 device */
		err = destroy_20k2_hw_obj(hw);
		break;
	default:
		err = -ENODEV;
		break;
	}

	return err;
}

unsigned int get_field(unsigned int data, unsigned int field)
{
	int i;

	if (WARN_ON(!field))
		return 0;
	/* @field should always be greater than 0 */
	for (i = 0; !(field & (1 << i)); )
		i++;

	return (data & field) >> i;
}

void set_field(unsigned int *data, unsigned int field, unsigned int value)
{
	int i;

	if (WARN_ON(!field))
		return;
	/* @field should always be greater than 0 */
	for (i = 0; !(field & (1 << i)); )
		i++;

	*data = (*data & (~field)) | ((value << i) & field);
}

gi/linux/net-next.git/log/tools/build/feature/.gitignore'>log</a><a href='/cgit.cgi/linux/net-next.git/tree/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>tree</a><a class='active' href='/cgit.cgi/linux/net-next.git/commit/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>commit</a><a href='/cgit.cgi/linux/net-next.git/diff/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>diff</a></td><td class='form'><form class='right' method='get' action='/cgit.cgi/linux/net-next.git/log/tools/build/feature/.gitignore'>
<input type='hidden' name='id' value='2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/cgit.cgi/linux/net-next.git/commit/?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>root</a>/<a href='/cgit.cgi/linux/net-next.git/commit/tools?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>tools</a>/<a href='/cgit.cgi/linux/net-next.git/commit/tools/build?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>build</a>/<a href='/cgit.cgi/linux/net-next.git/commit/tools/build/feature?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>feature</a>/<a href='/cgit.cgi/linux/net-next.git/commit/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>.gitignore</a></div><div class='content'><div class='cgit-panel'><b>diff options</b><form method='get'><input type='hidden' name='id' value='2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'/><table><tr><td colspan='2'/></tr><tr><td class='label'>context:</td><td class='ctrl'><select name='context' onchange='this.form.submit();'><option value='1'>1</option><option value='2'>2</option><option value='3' selected='selected'>3</option><option value='4'>4</option><option value='5'>5</option><option value='6'>6</option><option value='7'>7</option><option value='8'>8</option><option value='9'>9</option><option value='10'>10</option><option value='15'>15</option><option value='20'>20</option><option value='25'>25</option><option value='30'>30</option><option value='35'>35</option><option value='40'>40</option></select></td></tr><tr><td class='label'>space:</td><td class='ctrl'><select name='ignorews' onchange='this.form.submit();'><option value='0' selected='selected'>include</option><option value='1'>ignore</option></select></td></tr><tr><td class='label'>mode:</td><td class='ctrl'><select name='dt' onchange='this.form.submit();'><option value='0' selected='selected'>unified</option><option value='1'>ssdiff</option><option value='2'>stat only</option></select></td></tr><tr><td/><td class='ctrl'><noscript><input type='submit' value='reload'/></noscript></td></tr></table></form></div><table summary='commit info' class='commit-info'>
<tr><th>author</th><td>Linus Torvalds &lt;torvalds@linux-foundation.org&gt;</td><td class='right'>2017-01-16 09:34:37 -0800</td></tr>
<tr><th>committer</th><td>Linus Torvalds &lt;torvalds@linux-foundation.org&gt;</td><td class='right'>2017-01-16 09:34:37 -0800</td></tr>
<tr><th>commit</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc</a> (<a href='/cgit.cgi/linux/net-next.git/patch/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>patch</a>)</td></tr>
<tr><th>tree</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/tree/?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>4d8ea8e6ca52f1938269937834641205d8d888f0</a> /<a href='/cgit.cgi/linux/net-next.git/tree/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>tools/build/feature/.gitignore</a></td></tr>
<tr><th>parent</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/tools/build/feature/.gitignore?id=49def1853334396f948dcb4cedb9347abb318df5'>49def1853334396f948dcb4cedb9347abb318df5</a> (<a href='/cgit.cgi/linux/net-next.git/diff/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc&amp;id2=49def1853334396f948dcb4cedb9347abb318df5'>diff</a>)</td></tr><tr><th>parent</th><td colspan='2' class='oid'><a href='/cgit.cgi/linux/net-next.git/commit/tools/build/feature/.gitignore?id=ce1ca7d2d140a1f4aaffd297ac487f246963dd2f'>ce1ca7d2d140a1f4aaffd297ac487f246963dd2f</a> (<a href='/cgit.cgi/linux/net-next.git/diff/tools/build/feature/.gitignore?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc&amp;id2=ce1ca7d2d140a1f4aaffd297ac487f246963dd2f'>diff</a>)</td></tr></table>
<div class='commit-subject'>Merge tag 'nfsd-4.10-1' of git://linux-nfs.org/~bfields/linux</div><div class='commit-msg'>Pull nfsd fixes from Bruce Fields:
 "Miscellaneous nfsd bugfixes, one for a 4.10 regression, three for
  older bugs"

* tag 'nfsd-4.10-1' of git://linux-nfs.org/~bfields/linux:
  svcrdma: avoid duplicate dma unmapping during error recovery
  sunrpc: don't call sleeping functions from the notifier block callbacks
  svcrpc: don't leak contexts on PROC_DESTROY
  nfsd: fix supported attributes for acl &amp; labels
</div><div class='diffstat-header'><a href='/cgit.cgi/linux/net-next.git/diff/?id=2eabb8b8d68bc9c7779ba8b04bec8d4f8baed0bc'>Diffstat</a> (limited to 'tools/build/feature/.gitignore')</div><table summary='diffstat' class='diffstat'>