Garrison did not make the transition from minor to junior hockey until age 19. He did not play in the top tier of junior hockey in the Western Hockey League and instead joined the Nanaimo Clippers of the British Columbia Hockey League, where he played at the Junior A level for two years. Appearing in 52 regular season games in 2003–04, he recorded 7 goals and 27 assists as a rookie. A forward in his minor hockey years, Garrison switched to defence in his first junior year. Garrison went on to add 3 goals and 13 points over 24 playoff games as the Clippers won the Fred Page Cup as BCHL champions and the Doyle Cup as Western Canada regional champions. Competing for the national title at the 2004 Royal Bank Cup, the Clippers finished last out of five teams. Garrison had three assists in four tournament contests. The following season, he improved to 22 goals and 62 points over 57 games, ranking second in team scoring. The Clippers finished first in BCHL regular season play, but were eliminated in the Fred Page Cup Semi-finals. Earning an athletic scholarship, Garrison went on to play NCAA hockey with the University of Minnesota Duluth of the Western Collegiate Hockey Association. In his freshman year, he scored 3 goals and 12 assists over 40 games in 2005–06. In the following two seasons, Garrison struggled with injuries and recorded 3 points over 21 games and 14 points over 26 games in 2006–07 and 2007–08, respectively.
Professional
Florida Panthers
Garrison opted to forgo his senior year of college after being offered an NHL contract with the Florida Panthers. He signed a two-year, entry level contract with the team on April 2, 2008. Turning professional in 2008–09, he was assigned to the Panthers' American Hockey League affiliate, the Rochester Americans. Within a month, he was recalled by the Panthers and appeared in his first NHL game against the St. Louis Blues on October 25, 2008. It was the only NHL game he appeared in that season, as he was quickly returned to the minors. In the AHL, he scored 8 goals and 35 points in 75 games, ranking fourth among rookie defencemen in AHL scoring. in 2013 Garrison split the season in 2009–10 between the Panthers and the Americans, scoring his first NHL goal in a 7–4 victory over the Philadelphia Flyers on March 3, 2010. Playing in 39 NHL games, he scored two goals and eight points, while also recording 3 goals and 19 points in 38 AHL contests. Forming a shutdown pairing with Mike Weaver, Garrison played his first full season with the Panthers in 2010–11. Appearing in 73 games, he totalled 5 goals and 18 points. With a –2 plus-minus rating while playing on the worst team in the Eastern Conference, Garrison was ranked by James Mirtle of The Globe and Mail as the NHL's second-best defensive defenceman. Playing in his fourth season with the Panthers organization, Garrison was instrumental in the team's newfound success in 2011–12, playing in a more offensive role on a pairing with Brian Campbell. On March 23, 2012, Garrison set a Panthers franchise record for most goals by a defenceman in a single season with his 16th goal in a game against the Edmonton Oilers. He surpassed the previous mark of 15 set by Jay Bouwmeester and Bryan McCabe. His nine powerplay goals also tied the team record held by Bouwmeester and Gord Murphy. Adding 17 assists, Garrison finished with 33 points in 77 games, helping the Panthers reach the Stanley Cup playoffsfor the first time since 2000. Playing the New Jersey Devils in the first round, they were eliminated in seven games. Garrison recorded a goal and two assists in four playoff games before sustaining a pair of lower-body injuries that sidelined him for the remainder of the series.
Becoming an unrestricted free agent in the off-season, Garrison signed a six-year, $27.6 million contract with the Vancouver Canucks on July 1, 2012. His $4.6 million cap hit constituted a nearly sevenfold increase of his previous season's $675,000 salary. In the months ahead of his free agency, Garrison went on record as being interested in playing for the Canucks, his hometown team. Due to the 2012–13 NHL lockout, Garrison's debut with his new team was delayed until February 2013. Upon the commencement of NHL play, his struggles to adjust with his new team were well-publicized, as he was taken off the powerplay unit and separated from his intended defensive partner, Alexander Edler, within the first month. He would find success with Dan Hamhuis later in the season, however, reprising his role as a defensive-defenseman with a booming shot.
On June 27, 2014, Garrison was traded to the Tampa Bay Lightning in exchange for a second-round pick in the 2014 NHL Entry Draft. The pick was traded by Vancouver for forward Linden Vey. On October 31, 2015, Garrison skated in his 400th career NHL game, a 1–3 loss to the visiting Boston Bruins. On January 8, 2017, Garrison played in his 500th career NHL game.
On August 28, 2018, Garrison signed a professional tryout contract with the Edmonton Oilers, and on October 2, signed a one-year contract with the Oilers to begin the 2018–19 season. Initially starting as a healthy scratch, Garrison drew into the lineup for the Oilers appearing in 17 games for 1 goal before on December 30, 2018, Garrison was included in a trade by the Oilers to the Chicago Blackhawks in exchange for Brandon Manning and Robin Norell. The following day, Garrison was placed on waivers by the Blackhawks and upon clearing was assigned to join their AHL affiliate, the Rockford IceHogs, on January 1, 2019. After failing to report to the IceHogs, Garrison was placed on unconditional waivers by the Blackhawks in order to mutually terminate his contract on January 2, 2019.
Djurgårdens IF
Following his release from his contract with the Blackhawks, as a free agent, Garrison opted to pursue a career abroad, promptly signing his first contract abroad in agreeing to play for the remainder of the 2018–19 season in the Swedish Hockey League with Djurgårdens IF on January 7, 2019. Garrison played 20 games during the last half of the regular season, and scored 4 goals and 10 points. Garrison and Djurgården went on to a successful SHL playoff and eventually reached the finals against Frölunda HC, where the team lost 2–4 in games. Garrison played a total of 19 playoff games and scored 6 points. He extended his contract with Djurgården in May 2019 for another season, allowing him to play in the 2019–20 SHL season, but was unable to join the team until the middle of November due to tax regulations.